From c18ef13b3b9d23e486322b76a5f0b59aba9e0467 Mon Sep 17 00:00:00 2001 From: gnattu Date: Thu, 15 Feb 2024 23:00:51 +0800 Subject: [PATCH] feat: add tone mapping for videotoolbox Signed-off-by: gnattu --- .../MediaEncoding/EncodingHelper.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs index 9c0beceba8..19fe9ccd77 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs @@ -272,7 +272,8 @@ namespace MediaBrowser.Controller.MediaEncoding var isNvdecDecoder = vidDecoder.Contains("cuda", StringComparison.OrdinalIgnoreCase); var isVaapiDecoder = vidDecoder.Contains("vaapi", StringComparison.OrdinalIgnoreCase); var isD3d11vaDecoder = vidDecoder.Contains("d3d11va", StringComparison.OrdinalIgnoreCase); - return isSwDecoder || isNvdecDecoder || isVaapiDecoder || isD3d11vaDecoder; + var isVideoToolBoxDecoder = vidDecoder.Contains("videotoolbox", StringComparison.OrdinalIgnoreCase); + return isSwDecoder || isNvdecDecoder || isVaapiDecoder || isD3d11vaDecoder || isVideoToolBoxDecoder; } return state.VideoStream.VideoRange == VideoRange.HDR @@ -4988,6 +4989,8 @@ namespace MediaBrowser.Controller.MediaEncoding var noOverlay = swFilterChain.OverlayFilters.Count == 0; var supportsHwDeint = _mediaEncoder.SupportsFilter("yadif_videotoolbox"); var supportsHwScale = _mediaEncoder.SupportsFilter("scale_vt"); + // VideoToolbox is special. It does not use a separate tone mapping filter like others. Instead, it performs both tone mapping and scaling in a single filter. + var useHwToneMapping = IsHwTonemapAvailable(state, options) && supportsHwScale; // fallback to software filters if we are using filters not supported by hardware yet. var useHardwareFilters = noOverlay && (!doDeintH2645 || supportsHwDeint); @@ -5008,6 +5011,11 @@ namespace MediaBrowser.Controller.MediaEncoding if (supportsHwScale) { var hwScaleFilter = GetHwScaleFilter("vt", "", inW, inH, reqW, reqH, reqMaxW, reqMaxH); + if (useHwToneMapping) + { + hwScaleFilter = string.IsNullOrEmpty(hwScaleFilter) ? "scale_vt=0:0:bt709:bt709:bt709" + : string.Format(CultureInfo.InvariantCulture, hwScaleFilter, ":bt709:bt709:bt709"); + } newfilters.Add(hwScaleFilter); }