From 0da3d7e29a424c0d9083a1573f60dc007939d704 Mon Sep 17 00:00:00 2001 From: mani Date: Fri, 27 Feb 2026 01:18:15 +0100 Subject: [PATCH] Fix CRT shader VAAPI path: use reverse=1 instead of hwdownload+hwupload hwdownload+hwupload produced output with no video. Switch back to hwmap reverse=1 to VAAPI (then hwmap to QSV). Now that scale_opencl is gone and the shader processes NV12 natively, the OpenCL frames remain in the VAAPI-linked pool so reverse=1 is viable. Co-Authored-By: Claude Sonnet 4.6 --- .../MediaEncoding/EncodingHelper.cs | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs index 759c9aaaa0..b830c9b56d 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs @@ -4925,23 +4925,19 @@ namespace MediaBrowser.Controller.MediaEncoding { if (IsCrtShaderEnabled(state)) { - // VAAPI → OpenCL → CRT (NV12) → CPU → QSV. - // program_opencl outputs NV12 frames into its own pool; we cannot - // rely on hwmap reverse=1 back to VAAPI from those new frames. - // hwdownload then hwupload (-filter_hw_device qsv) is the safe path. + // VAAPI → OpenCL → CRT (NV12) → VAAPI (reverse=1) → QSV. + // Shader now works in NV12 throughout (no scale_opencl format break), + // so program_opencl output stays in the VAAPI-linked OpenCL pool. + // reverse=1 to VAAPI mirrors the doOclTonemap+isVaInVaOut path. mainFilters.Add("hwmap=derive_device=opencl:mode=read"); mainFilters.AddRange(GetCrtShaderOclFilters(state)); - mainFilters.Add("hwdownload"); - mainFilters.Add("format=nv12"); - mainFilters.Add("hwupload"); - mainFilters.Add("format=qsv"); - } - else - { - // VAAPI → QSV (zero-copy, shared libva surface) - mainFilters.Add("hwmap=derive_device=qsv"); - mainFilters.Add("format=qsv"); + mainFilters.Add("hwmap=derive_device=vaapi:mode=write:reverse=1"); + mainFilters.Add("format=vaapi"); } + + // VAAPI → QSV (zero-copy, shared libva surface) [both paths] + mainFilters.Add("hwmap=derive_device=qsv"); + mainFilters.Add("format=qsv"); } else if (isQsvDecoder) {