|
|
|
@ -2217,85 +2217,57 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|
|
|
|
|
|
|
|
|
var request = state.BaseRequest;
|
|
|
|
|
|
|
|
|
|
var inputChannels = audioStream.Channels;
|
|
|
|
|
var codec = outputAudioCodec ?? string.Empty;
|
|
|
|
|
|
|
|
|
|
if (inputChannels <= 0)
|
|
|
|
|
{
|
|
|
|
|
inputChannels = null;
|
|
|
|
|
}
|
|
|
|
|
int? resultChannels = state.GetRequestedAudioChannels(codec);
|
|
|
|
|
|
|
|
|
|
var codec = outputAudioCodec ?? string.Empty;
|
|
|
|
|
var inputChannels = audioStream.Channels;
|
|
|
|
|
|
|
|
|
|
int? transcoderChannelLimit;
|
|
|
|
|
if (codec.IndexOf("wma", StringComparison.OrdinalIgnoreCase) != -1)
|
|
|
|
|
{
|
|
|
|
|
// wmav2 currently only supports two channel output
|
|
|
|
|
transcoderChannelLimit = 2;
|
|
|
|
|
}
|
|
|
|
|
else if (codec.IndexOf("mp3", StringComparison.OrdinalIgnoreCase) != -1)
|
|
|
|
|
if (inputChannels > 0)
|
|
|
|
|
{
|
|
|
|
|
// 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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (inputChannels.HasValue)
|
|
|
|
|
{
|
|
|
|
|
resultChannels = resultChannels.HasValue
|
|
|
|
|
? Math.Min(resultChannels.Value, inputChannels.Value)
|
|
|
|
|
: inputChannels.Value;
|
|
|
|
|
}
|
|
|
|
|
// 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 (isTranscodingAudio && transcoderChannelLimit.HasValue)
|
|
|
|
|
{
|
|
|
|
|
resultChannels = resultChannels.HasValue
|
|
|
|
|
? Math.Min(resultChannels.Value, transcoderChannelLimit.Value)
|
|
|
|
|
: transcoderChannelLimit.Value;
|
|
|
|
|
}
|
|
|
|
|
// Set resultChannels to minimum between resultChannels, TranscodingMaxAudioChannels, 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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return resultChannels;
|
|
|
|
|
}
|
|
|
|
|
resultChannels = transcoderChannelLimit < resultChannels ? transcoderChannelLimit : resultChannels ?? transcoderChannelLimit;
|
|
|
|
|
|
|
|
|
|
private int? GetMinValue(int? val1, int? val2)
|
|
|
|
|
{
|
|
|
|
|
if (!val1.HasValue)
|
|
|
|
|
{
|
|
|
|
|
return val2;
|
|
|
|
|
}
|
|
|
|
|
if (request.TranscodingMaxAudioChannels < resultChannels)
|
|
|
|
|
{
|
|
|
|
|
resultChannels = request.TranscodingMaxAudioChannels;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!val2.HasValue)
|
|
|
|
|
{
|
|
|
|
|
return val1;
|
|
|
|
|
// 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 Math.Min(val1.Value, val2.Value);
|
|
|
|
|
return resultChannels;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|