diff --git a/server/src/services/media.service.spec.ts b/server/src/services/media.service.spec.ts index ce28ee0ec1..c2039e7ce6 100644 --- a/server/src/services/media.service.spec.ts +++ b/server/src/services/media.service.spec.ts @@ -2133,7 +2133,7 @@ describe(MediaService.name, () => { '-map 0:1', '-g 256', '-v verbose', - '-vf scale_rkrga=-2:720:format=nv12:afbc=1', + '-vf scale_rkrga=-2:720:format=nv12:afbc=1:async_depth=4', '-level 51', '-rc_mode CQP', '-qp_init 23', @@ -2204,7 +2204,7 @@ describe(MediaService.name, () => { inputOptions: expect.arrayContaining(['-hwaccel rkmpp', '-hwaccel_output_format drm_prime', '-afbc rga']), outputOptions: expect.arrayContaining([ expect.stringContaining( - 'scale_rkrga=-2:720:format=p010:afbc=1,hwmap=derive_device=opencl:mode=read,tonemap_opencl=format=nv12:r=pc:p=bt709:t=bt709:m=bt709:tonemap=hable:desat=0:tonemap_mode=lum:peak=100,hwmap=derive_device=rkmpp:mode=write:reverse=1,format=drm_prime', + 'scale_rkrga=-2:720:format=p010:afbc=1:async_depth=4,hwmap=derive_device=opencl:mode=read,tonemap_opencl=format=nv12:r=pc:p=bt709:t=bt709:m=bt709:tonemap=hable:desat=0:tonemap_mode=lum:peak=100,hwmap=derive_device=rkmpp:mode=write:reverse=1,format=drm_prime', ), ]), twoPass: false, @@ -2228,7 +2228,7 @@ describe(MediaService.name, () => { inputOptions: expect.arrayContaining(['-hwaccel rkmpp', '-hwaccel_output_format drm_prime', '-afbc rga']), outputOptions: expect.arrayContaining([ expect.stringContaining( - 'scale_rkrga=-2:720:format=nv12:afbc=1', + 'scale_rkrga=-2:720:format=nv12:afbc=1:async_depth=4', ), ]), twoPass: false, diff --git a/server/src/services/media.service.ts b/server/src/services/media.service.ts index e2a31caef6..362b3379fd 100644 --- a/server/src/services/media.service.ts +++ b/server/src/services/media.service.ts @@ -329,9 +329,11 @@ export class MediaService extends BaseService { } if (ffmpeg.accel === TranscodeHWAccel.DISABLED) { - this.logger.log(`Encoding video ${asset.id} without hardware acceleration`); + this.logger.log(`Transcoding video ${asset.id} without hardware acceleration`); } else { - this.logger.log(`Encoding video ${asset.id} with ${ffmpeg.accel.toUpperCase()} acceleration`); + this.logger.log( + `Transcoding video ${asset.id} with ${ffmpeg.accel.toUpperCase()}-accelerated encoding and${ffmpeg.accelDecode ? '' : ' software'} decoding`, + ); } try { @@ -345,8 +347,8 @@ export class MediaService extends BaseService { let partialFallbackSuccess = false; if (ffmpeg.accelDecode) { try { - this.logger.error(`Retrying with ${ffmpeg.accel.toUpperCase()} acceleration but software decoding`); - const config = BaseConfig.create({...ffmpeg, accelDecode: false}); + this.logger.error(`Retrying with ${ffmpeg.accel.toUpperCase()}-accelerated encoding and software decoding`); + const config = BaseConfig.create({ ...ffmpeg, accelDecode: false }); command = config.getCommand(target, mainVideoStream, mainAudioStream); await this.mediaRepository.transcode(input, output, command); partialFallbackSuccess = true; @@ -357,7 +359,7 @@ export class MediaService extends BaseService { if (!partialFallbackSuccess) { this.logger.error(`Retrying with ${ffmpeg.accel.toUpperCase()} acceleration disabled`); - const config = BaseConfig.create({...ffmpeg, accel: TranscodeHWAccel.DISABLED}); + const config = BaseConfig.create({ ...ffmpeg, accel: TranscodeHWAccel.DISABLED }); command = config.getCommand(target, mainVideoStream, mainAudioStream); await this.mediaRepository.transcode(input, output, command); } diff --git a/server/src/utils/media.ts b/server/src/utils/media.ts index a4f70ebd8b..a979b84025 100644 --- a/server/src/utils/media.ts +++ b/server/src/utils/media.ts @@ -990,7 +990,7 @@ export class RkmppHwDecodeConfig extends RkmppSwDecodeConfig { const { primaries, transfer, matrix } = this.getColors(); if (this.hasMaliOpenCL) { return [ // use RKMPP for scaling, OpenCL for tone mapping - `scale_rkrga=${this.getScaling(videoStream)}:format=p010:afbc=1`, + `scale_rkrga=${this.getScaling(videoStream)}:format=p010:afbc=1:async_depth=4`, 'hwmap=derive_device=opencl:mode=read', `tonemap_opencl=format=nv12:r=pc:p=${primaries}:t=${transfer}:m=${matrix}:tonemap=${this.config.tonemap}:desat=0:tonemap_mode=lum:peak=100`, 'hwmap=derive_device=rkmpp:mode=write:reverse=1', @@ -998,14 +998,14 @@ export class RkmppHwDecodeConfig extends RkmppSwDecodeConfig { ]; } return [ // use RKMPP for scaling, CPU for tone mapping (only works on RK3588 which support 10bit output) - `scale_rkrga=${this.getScaling(videoStream)}:format=p010`, + `scale_rkrga=${this.getScaling(videoStream)}:format=p010:afbc=1:async_depth=4`, 'hwdownload', - 'format=yuv420p10le', + 'format=p010', `tonemapx=tonemap=${this.config.tonemap}:desat=0:p=${primaries}:t=${transfer}:m=${matrix}:r=pc:peak=100:format=yuv420p`, 'hwupload', ]; } else if (this.shouldScale(videoStream)) { - return [`scale_rkrga=${this.getScaling(videoStream)}:format=nv12:afbc=1`]; + return [`scale_rkrga=${this.getScaling(videoStream)}:format=nv12:afbc=1:async_depth=4`]; } return []; }