From ddc25692586a433d1c06fd0f39042114644f56af Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Sat, 8 Jan 2022 22:31:45 +0800 Subject: [PATCH] Fix the wrong logic in HEVC VP9 10bit hwdec boxes --- .../MediaEncoding/EncodingHelper.cs | 45 +++++++++++++------ 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs index 9c96d24728..cbf904061c 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs @@ -11,6 +11,7 @@ using System.Text; using System.Text.RegularExpressions; using System.Threading; using Jellyfin.Data.Enums; +using Jellyfin.Extensions; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Dto; @@ -1318,7 +1319,7 @@ namespace MediaBrowser.Controller.MediaEncoding { string[] valid_h264_qsv = { "veryslow", "slower", "slow", "medium", "fast", "faster", "veryfast" }; - if (valid_h264_qsv.Contains(encodingOptions.EncoderPreset, StringComparer.OrdinalIgnoreCase)) + if (valid_h264_qsv.Contains(encodingOptions.EncoderPreset, StringComparison.OrdinalIgnoreCase)) { param += " -preset " + encodingOptions.EncoderPreset; } @@ -1669,7 +1670,7 @@ namespace MediaBrowser.Controller.MediaEncoding // Source and target codecs must match if (string.IsNullOrEmpty(videoStream.Codec) - || !state.SupportedVideoCodecs.Contains(videoStream.Codec, StringComparer.OrdinalIgnoreCase)) + || !state.SupportedVideoCodecs.Contains(videoStream.Codec, StringComparison.OrdinalIgnoreCase)) { return false; } @@ -1687,7 +1688,7 @@ namespace MediaBrowser.Controller.MediaEncoding var requestedProfile = requestedProfiles[0]; // strip spaces because they may be stripped out on the query string as well if (!string.IsNullOrEmpty(videoStream.Profile) - && !requestedProfiles.Contains(videoStream.Profile.Replace(" ", string.Empty, StringComparison.Ordinal), StringComparer.OrdinalIgnoreCase)) + && !requestedProfiles.Contains(videoStream.Profile.Replace(" ", string.Empty, StringComparison.Ordinal), StringComparison.OrdinalIgnoreCase)) { var currentScore = GetVideoProfileScore(videoStream.Codec, videoStream.Profile); var requestedScore = GetVideoProfileScore(videoStream.Codec, requestedProfile); @@ -1794,7 +1795,7 @@ namespace MediaBrowser.Controller.MediaEncoding // Source and target codecs must match if (string.IsNullOrEmpty(audioStream.Codec) - || !supportedAudioCodecs.Contains(audioStream.Codec, StringComparer.OrdinalIgnoreCase)) + || !supportedAudioCodecs.Contains(audioStream.Codec, StringComparison.OrdinalIgnoreCase)) { return false; } @@ -4302,11 +4303,19 @@ namespace MediaBrowser.Controller.MediaEncoding var decoderName = decoderPrefix + '_' + decoderSuffix; - var isCodecAvailable = _mediaEncoder.SupportsDecoder(decoderName) && options.HardwareDecodingCodecs.Contains(videoCodec, StringComparer.OrdinalIgnoreCase); + var isCodecAvailable = _mediaEncoder.SupportsDecoder(decoderName) && options.HardwareDecodingCodecs.Contains(videoCodec, StringComparison.OrdinalIgnoreCase); if (bitDepth == 10 && isCodecAvailable) { - if ((options.HardwareDecodingCodecs.Contains("hevc", StringComparer.OrdinalIgnoreCase) && !options.EnableDecodingColorDepth10Hevc) - || (options.HardwareDecodingCodecs.Contains("vp9", StringComparer.OrdinalIgnoreCase) && !options.EnableDecodingColorDepth10Vp9)) + if (string.Equals(videoCodec, "hevc", StringComparison.OrdinalIgnoreCase) + && options.HardwareDecodingCodecs.Contains("hevc", StringComparison.OrdinalIgnoreCase) + && !options.EnableDecodingColorDepth10Hevc) + { + return null; + } + + if (string.Equals(videoCodec, "vp9", StringComparison.OrdinalIgnoreCase) + && options.HardwareDecodingCodecs.Contains("vp9", StringComparison.OrdinalIgnoreCase) + && !options.EnableDecodingColorDepth10Vp9) { return null; } @@ -4344,15 +4353,23 @@ namespace MediaBrowser.Controller.MediaEncoding var isCudaSupported = (isLinux || isWindows) && IsCudaFullSupported(); var isQsvSupported = (isLinux || isWindows) && _mediaEncoder.SupportsHwaccel("qsv"); var isVideotoolboxSupported = isMacOS && _mediaEncoder.SupportsHwaccel("videotoolbox"); - var isCodecAvailable = options.HardwareDecodingCodecs.Contains(videoCodec, StringComparer.OrdinalIgnoreCase); + var isCodecAvailable = options.HardwareDecodingCodecs.Contains(videoCodec, StringComparison.OrdinalIgnoreCase); // Set the av1 codec explicitly to trigger hw accelerator, otherwise libdav1d will be used. var isAv1 = string.Equals(videoCodec, "av1", StringComparison.OrdinalIgnoreCase); if (bitDepth == 10 && isCodecAvailable) { - if ((options.HardwareDecodingCodecs.Contains("hevc", StringComparer.OrdinalIgnoreCase) && !options.EnableDecodingColorDepth10Hevc) - || (options.HardwareDecodingCodecs.Contains("vp9", StringComparer.OrdinalIgnoreCase) && !options.EnableDecodingColorDepth10Vp9)) + if (string.Equals(videoCodec, "hevc", StringComparison.OrdinalIgnoreCase) + && options.HardwareDecodingCodecs.Contains("hevc", StringComparison.OrdinalIgnoreCase) + && !options.EnableDecodingColorDepth10Hevc) + { + return null; + } + + if (string.Equals(videoCodec, "vp9", StringComparison.OrdinalIgnoreCase) + && options.HardwareDecodingCodecs.Contains("vp9", StringComparison.OrdinalIgnoreCase) + && !options.EnableDecodingColorDepth10Vp9) { return null; } @@ -5072,12 +5089,12 @@ namespace MediaBrowser.Controller.MediaEncoding // Transcoding to 2ch ac3 almost always causes a playback failure // Keep it in the supported codecs list, but shift it to the end of the list so that if transcoding happens, another codec is used var shiftAudioCodecs = new[] { "ac3", "eac3" }; - if (audioCodecs.All(i => shiftAudioCodecs.Contains(i, StringComparer.OrdinalIgnoreCase))) + if (audioCodecs.All(i => shiftAudioCodecs.Contains(i, StringComparison.OrdinalIgnoreCase))) { return; } - while (shiftAudioCodecs.Contains(audioCodecs[0], StringComparer.OrdinalIgnoreCase)) + while (shiftAudioCodecs.Contains(audioCodecs[0], StringComparison.OrdinalIgnoreCase)) { var removed = shiftAudioCodecs[0]; audioCodecs.RemoveAt(0); @@ -5100,12 +5117,12 @@ namespace MediaBrowser.Controller.MediaEncoding } var shiftVideoCodecs = new[] { "hevc", "h265" }; - if (videoCodecs.All(i => shiftVideoCodecs.Contains(i, StringComparer.OrdinalIgnoreCase))) + if (videoCodecs.All(i => shiftVideoCodecs.Contains(i, StringComparison.OrdinalIgnoreCase))) { return; } - while (shiftVideoCodecs.Contains(videoCodecs[0], StringComparer.OrdinalIgnoreCase)) + while (shiftVideoCodecs.Contains(videoCodecs[0], StringComparison.OrdinalIgnoreCase)) { var removed = shiftVideoCodecs[0]; videoCodecs.RemoveAt(0);