From 724d2986a313823f5ded5c5745ab193cbd89e921 Mon Sep 17 00:00:00 2001 From: holow29 <67209066+holow29@users.noreply.github.com> Date: Mon, 6 Feb 2023 00:40:49 -0500 Subject: [PATCH] Change transcoderChannelLimit default to 8 Change transcoderChannelLimit default to 8 from 6 Switch to querying for encoder and added more cases to transcoderChannelLimit Refactor GetNumAudioChannelsParam --- .../MediaEncoding/EncodingHelper.cs | 100 +++++++----------- 1 file changed, 36 insertions(+), 64 deletions(-) diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs index 9b5edabc0..98a6f47ba 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs @@ -2211,87 +2211,59 @@ namespace MediaBrowser.Controller.MediaEncoding var request = state.BaseRequest; - var inputChannels = audioStream.Channels; - - if (inputChannels <= 0) - { - inputChannels = null; - } - var codec = outputAudioCodec ?? string.Empty; - int? transcoderChannelLimit; - if (codec.IndexOf("wma", StringComparison.OrdinalIgnoreCase) != -1) + int? resultChannels = state.GetRequestedAudioChannels(codec); + + var inputChannels = audioStream.Channels; + + if (inputChannels > 0) { - // wmav2 currently only supports two channel output - transcoderChannelLimit = 2; - } - else if (codec.IndexOf("mp3", StringComparison.OrdinalIgnoreCase) != -1) - { - // libmp3lame currently only supports two channel output - transcoderChannelLimit = 2; - } - else if (codec.IndexOf("aac", StringComparison.OrdinalIgnoreCase) != -1) - { - // aac is able to handle 8ch(7.1 layout) - transcoderChannelLimit = 8; - } - else - { - // If we don't have any media info then limit it to 6 to prevent encoding errors due to asking for too many channels - transcoderChannelLimit = 6; + resultChannels = inputChannels < resultChannels ? inputChannels : resultChannels ?? inputChannels; } var isTranscodingAudio = !IsCopyCodec(codec); - int? resultChannels = state.GetRequestedAudioChannels(codec); if (isTranscodingAudio) { - resultChannels = GetMinValue(request.TranscodingMaxAudioChannels, resultChannels); - } + // Set max transcoding channels for encoders that can't handle more than a set amount of channels + // AAC, FLAC, ALAC, libopus, libvorbis encoders all support at least 8 channels + int transcoderChannelLimit = GetAudioEncoder(state) switch + { + string audioEncoder when audioEncoder.Equals("wmav2", StringComparison.OrdinalIgnoreCase) + || audioEncoder.Equals("libmp3lame", StringComparison.OrdinalIgnoreCase) => 2, + string audioEncoder when audioEncoder.Equals("libfdk_aac", StringComparison.OrdinalIgnoreCase) + || audioEncoder.Equals("aac_at", StringComparison.OrdinalIgnoreCase) + || audioEncoder.Equals("ac3", StringComparison.OrdinalIgnoreCase) + || audioEncoder.Equals("eac3", StringComparison.OrdinalIgnoreCase) + || audioEncoder.Equals("dts", StringComparison.OrdinalIgnoreCase) + || audioEncoder.Equals("mlp", StringComparison.OrdinalIgnoreCase) + || audioEncoder.Equals("truehd", StringComparison.OrdinalIgnoreCase) => 6, + // Set default max transcoding channels to 8 to prevent encoding errors due to asking for too many channels + _ => 8, + }; - if (inputChannels.HasValue) - { - resultChannels = resultChannels.HasValue - ? Math.Min(resultChannels.Value, inputChannels.Value) - : inputChannels.Value; - } + // Set resultChannels to minimum between resultChannels, TranscodingMaxAudioChannels, transcoderChannelLimit - if (isTranscodingAudio && transcoderChannelLimit.HasValue) - { - resultChannels = resultChannels.HasValue - ? Math.Min(resultChannels.Value, transcoderChannelLimit.Value) - : transcoderChannelLimit.Value; - } + resultChannels = transcoderChannelLimit < resultChannels ? transcoderChannelLimit : resultChannels ?? transcoderChannelLimit; - // Avoid transcoding to audio channels other than 1ch, 2ch, 6ch (5.1 layout) and 8ch (7.1 layout). - // https://developer.apple.com/documentation/http_live_streaming/hls_authoring_specification_for_apple_devices - if (isTranscodingAudio - && state.TranscodingType != TranscodingJobType.Progressive - && resultChannels.HasValue - && ((resultChannels.Value > 2 && resultChannels.Value < 6) || resultChannels.Value == 7)) - { - resultChannels = 2; + if (request.TranscodingMaxAudioChannels < resultChannels) + { + resultChannels = request.TranscodingMaxAudioChannels; + } + + // Avoid transcoding to audio channels other than 1ch, 2ch, 6ch (5.1 layout) and 8ch (7.1 layout). + // https://developer.apple.com/documentation/http_live_streaming/hls_authoring_specification_for_apple_devices + if (state.TranscodingType != TranscodingJobType.Progressive + && ((resultChannels > 2 && resultChannels < 6) || resultChannels == 7)) + { + resultChannels = 2; + } } return resultChannels; } - private int? GetMinValue(int? val1, int? val2) - { - if (!val1.HasValue) - { - return val2; - } - - if (!val2.HasValue) - { - return val1; - } - - return Math.Min(val1.Value, val2.Value); - } - /// /// Enforces the resolution limit. ///