From 0d130b8957ba964982f69d929c7f99affd426c00 Mon Sep 17 00:00:00 2001 From: Mert <101130780+mertalev@users.noreply.github.com> Date: Sun, 7 Apr 2024 12:43:50 -0400 Subject: [PATCH] fix(server): x264/x265 params not being set correctly (#8587) --- server/src/services/media.service.spec.ts | 18 ++++++++--------- server/src/utils/media.ts | 24 ++++++++++------------- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/server/src/services/media.service.spec.ts b/server/src/services/media.service.spec.ts index 3a650430ef..583a883bfb 100644 --- a/server/src/services/media.service.spec.ts +++ b/server/src/services/media.service.spec.ts @@ -1091,9 +1091,9 @@ describe(MediaService.name, () => { ); }); - it('should disable thread pooling for h264 if thread limit is above 0', async () => { + it('should disable thread pooling for h264 if thread limit is 1', async () => { mediaMock.probe.mockResolvedValue(probeStub.matroskaContainer); - configMock.load.mockResolvedValue([{ key: SystemConfigKey.FFMPEG_THREADS, value: 2 }]); + configMock.load.mockResolvedValue([{ key: SystemConfigKey.FFMPEG_THREADS, value: 1 }]); assetMock.getByIds.mockResolvedValue([assetStub.video]); await sut.handleVideoConversion({ id: assetStub.video.id }); expect(mediaMock.transcode).toHaveBeenCalledWith( @@ -1111,9 +1111,8 @@ describe(MediaService.name, () => { '-v verbose', '-vf scale=-2:720,format=yuv420p', '-preset ultrafast', - '-threads 2', - '-x264-params "pools=none"', - '-x264-params "frame-threads=2"', + '-threads 1', + '-x264-params frame-threads=1:pools=none', '-crf 23', ], twoPass: false, @@ -1148,10 +1147,10 @@ describe(MediaService.name, () => { ); }); - it('should disable thread pooling for hevc if thread limit is above 0', async () => { + it('should disable thread pooling for hevc if thread limit is 1', async () => { mediaMock.probe.mockResolvedValue(probeStub.videoStreamVp9); configMock.load.mockResolvedValue([ - { key: SystemConfigKey.FFMPEG_THREADS, value: 2 }, + { key: SystemConfigKey.FFMPEG_THREADS, value: 1 }, { key: SystemConfigKey.FFMPEG_TARGET_VIDEO_CODEC, value: VideoCodec.HEVC }, ]); assetMock.getByIds.mockResolvedValue([assetStub.video]); @@ -1172,9 +1171,8 @@ describe(MediaService.name, () => { '-v verbose', '-vf scale=-2:720,format=yuv420p', '-preset ultrafast', - '-threads 2', - '-x265-params "pools=none"', - '-x265-params "frame-threads=2"', + '-threads 1', + '-x265-params frame-threads=1:pools=none', '-crf 23', ], twoPass: false, diff --git a/server/src/utils/media.ts b/server/src/utils/media.ts index 5f1218766a..01ffbec48d 100644 --- a/server/src/utils/media.ts +++ b/server/src/utils/media.ts @@ -343,27 +343,23 @@ export class ThumbnailConfig extends BaseConfig { export class H264Config extends BaseConfig { getThreadOptions() { - if (this.config.threads <= 0) { - return []; + const options = super.getThreadOptions(); + if (this.config.threads === 1) { + options.push('-x264-params frame-threads=1:pools=none'); } - return [ - ...super.getThreadOptions(), - '-x264-params "pools=none"', - `-x264-params "frame-threads=${this.config.threads}"`, - ]; + + return options; } } export class HEVCConfig extends BaseConfig { getThreadOptions() { - if (this.config.threads <= 0) { - return []; + const options = super.getThreadOptions(); + if (this.config.threads === 1) { + options.push('-x265-params frame-threads=1:pools=none'); } - return [ - ...super.getThreadOptions(), - '-x265-params "pools=none"', - `-x265-params "frame-threads=${this.config.threads}"`, - ]; + + return options; } }