diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs index d4852decba..d46f1c2981 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs @@ -4924,14 +4924,21 @@ namespace MediaBrowser.Controller.MediaEncoding { if (IsCrtShaderEnabled(state)) { - // VAAPI → OpenCL → CRT → VAAPI round-trip, then map to QSV + // VAAPI → OpenCL → CRT → QSV (direct, no VAAPI intermediate). + // After scale_opencl the surface has no VAAPI association left, + // so reverse=1 to vaapi would fail. Map straight to QSV instead + // (on Intel, VAAPI and QSV share the same libva surfaces, so the + // QSV interop works for frames that originated in VAAPI). mainFilters.Add("hwmap=derive_device=opencl:mode=read"); mainFilters.AddRange(GetCrtShaderOclFilters(state)); - mainFilters.Add("hwmap=derive_device=vaapi:mode=write:reverse=1"); + mainFilters.Add("hwmap=derive_device=qsv:mode=write:reverse=1:extra_hw_frames=16"); + mainFilters.Add("format=qsv"); + } + else + { + mainFilters.Add("hwmap=derive_device=qsv"); + mainFilters.Add("format=qsv"); } - - mainFilters.Add("hwmap=derive_device=qsv"); - mainFilters.Add("format=qsv"); } else if (isQsvDecoder) {