diff --git a/server/src/services/media.service.spec.ts b/server/src/services/media.service.spec.ts index 6152c47218..65d35047d7 100644 --- a/server/src/services/media.service.spec.ts +++ b/server/src/services/media.service.spec.ts @@ -2260,7 +2260,7 @@ describe(MediaService.name, () => { ); }); - it('should use software decoding and tone-mapping if opencl is not available', async () => { + it('should use software tone-mapping if opencl is not available', async () => { storageMock.readdir.mockResolvedValue(['renderD128']); storageMock.stat.mockResolvedValue({ isFile: () => false, isCharacterDevice: () => false } as Stats); mediaMock.probe.mockResolvedValue(probeStub.videoStreamHDR); @@ -2273,10 +2273,10 @@ describe(MediaService.name, () => { '/original/path.ext', 'upload/encoded-video/user-id/as/se/asset-id.mp4', expect.objectContaining({ - inputOptions: [], + inputOptions: expect.any(Array), outputOptions: expect.arrayContaining([ expect.stringContaining( - 'tonemapx=tonemap=hable:desat=0:p=bt709:t=bt709:m=bt709:r=pc:peak=100:format=yuv420p', + 'tonemapx=tonemap=hable:desat=0:p=bt709:t=bt709:m=bt709:r=pc:peak=100:format=', ), ]), twoPass: false, diff --git a/server/src/utils/media.ts b/server/src/utils/media.ts index 978dabe95f..119c3db8fd 100644 --- a/server/src/utils/media.ts +++ b/server/src/utils/media.ts @@ -987,18 +987,23 @@ export class RkmppHwDecodeConfig extends RkmppSwDecodeConfig { getFilterOptions(videoStream: VideoStreamInfo) { if (this.shouldToneMap(videoStream)) { + const { primaries, transfer, matrix } = this.getColors(); if (this.hasMaliOpenCL) { - const { primaries, transfer, matrix } = this.getColors(); - return [ + return [ // use RKMPP for scaling, OpenCL for tone mapping `scale_rkrga=${this.getScaling(videoStream)}:format=p010:afbc=1`, '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', 'format=drm_prime', ]; - } else { - return super.getFilterOptions(videoStream); } + return [ // use RKMPP for scaling, CPU for tone mapping + `scale_rkrga=${this.getScaling(videoStream)}:format=nv12`, + 'hwdownload', + 'format=nv12', + `tonemapx=tonemap=${this.config.tonemap}:desat=0:p=${primaries}:t=${transfer}:m=${matrix}:r=pc:peak=100:format=nv12`, + 'hwupload', + ]; } else if (this.shouldScale(videoStream)) { return [`scale_rkrga=${this.getScaling(videoStream)}:format=nv12:afbc=1`]; }