StreamBuilder.cs (jellyfin-10.8.9) | : | StreamBuilder.cs (jellyfin-10.8.10) | ||
---|---|---|---|---|
skipping to change at line 26 | skipping to change at line 26 | |||
public class StreamBuilder | public class StreamBuilder | |||
{ | { | |||
// Aliases | // Aliases | |||
internal const TranscodeReason ContainerReasons = TranscodeReason.Contai nerNotSupported | TranscodeReason.ContainerBitrateExceedsLimit; | internal const TranscodeReason ContainerReasons = TranscodeReason.Contai nerNotSupported | TranscodeReason.ContainerBitrateExceedsLimit; | |||
internal const TranscodeReason AudioReasons = TranscodeReason.AudioCodec NotSupported | TranscodeReason.AudioBitrateNotSupported | TranscodeReason.AudioC hannelsNotSupported | TranscodeReason.AudioProfileNotSupported | TranscodeReason .AudioSampleRateNotSupported | TranscodeReason.SecondaryAudioNotSupported | Tran scodeReason.AudioBitDepthNotSupported | TranscodeReason.AudioIsExternal; | internal const TranscodeReason AudioReasons = TranscodeReason.AudioCodec NotSupported | TranscodeReason.AudioBitrateNotSupported | TranscodeReason.AudioC hannelsNotSupported | TranscodeReason.AudioProfileNotSupported | TranscodeReason .AudioSampleRateNotSupported | TranscodeReason.SecondaryAudioNotSupported | Tran scodeReason.AudioBitDepthNotSupported | TranscodeReason.AudioIsExternal; | |||
internal const TranscodeReason VideoReasons = TranscodeReason.VideoCodec NotSupported | TranscodeReason.VideoResolutionNotSupported | TranscodeReason.Ana morphicVideoNotSupported | TranscodeReason.InterlacedVideoNotSupported | Transco deReason.VideoBitDepthNotSupported | TranscodeReason.VideoBitrateNotSupported | TranscodeReason.VideoFramerateNotSupported | TranscodeReason.VideoLevelNotSuppor ted | TranscodeReason.RefFramesNotSupported; | internal const TranscodeReason VideoReasons = TranscodeReason.VideoCodec NotSupported | TranscodeReason.VideoResolutionNotSupported | TranscodeReason.Ana morphicVideoNotSupported | TranscodeReason.InterlacedVideoNotSupported | Transco deReason.VideoBitDepthNotSupported | TranscodeReason.VideoBitrateNotSupported | TranscodeReason.VideoFramerateNotSupported | TranscodeReason.VideoLevelNotSuppor ted | TranscodeReason.RefFramesNotSupported; | |||
internal const TranscodeReason DirectStreamReasons = AudioReasons | Tran scodeReason.ContainerNotSupported; | internal const TranscodeReason DirectStreamReasons = AudioReasons | Tran scodeReason.ContainerNotSupported; | |||
private readonly ILogger _logger; | private readonly ILogger _logger; | |||
private readonly ITranscoderSupport _transcoderSupport; | private readonly ITranscoderSupport _transcoderSupport; | |||
private static readonly string[] _supportedHlsVideoCodecs = new string[] | ||||
{ "h264", "hevc" }; | ||||
private static readonly string[] _supportedHlsAudioCodecsTs = new string | ||||
[] { "aac", "ac3", "eac3", "mp3" }; | ||||
private static readonly string[] _supportedHlsAudioCodecsMp4 = new strin | ||||
g[] { "aac", "ac3", "eac3", "mp3", "alac", "flac", "opus", "dca", "truehd" }; | ||||
public StreamBuilder(ITranscoderSupport transcoderSupport, ILogger logge r) | public StreamBuilder(ITranscoderSupport transcoderSupport, ILogger logge r) | |||
{ | { | |||
_transcoderSupport = transcoderSupport; | _transcoderSupport = transcoderSupport; | |||
_logger = logger; | _logger = logger; | |||
} | } | |||
public StreamBuilder(ILogger<StreamBuilder> logger) | public StreamBuilder(ILogger<StreamBuilder> logger) | |||
: this(new FullTranscoderSupport(), logger) | : this(new FullTranscoderSupport(), logger) | |||
{ | { | |||
skipping to change at line 735 | skipping to change at line 738 | |||
{ | { | |||
return null; | return null; | |||
} | } | |||
var transcodingProfiles = options.Profile.TranscodingProfiles | var transcodingProfiles = options.Profile.TranscodingProfiles | |||
.Where(i => i.Type == playlistItem.MediaType && i.Context == opt ions.Context); | .Where(i => i.Type == playlistItem.MediaType && i.Context == opt ions.Context); | |||
if (options.AllowVideoStreamCopy) | if (options.AllowVideoStreamCopy) | |||
{ | { | |||
// prefer direct copy profile | // prefer direct copy profile | |||
float videoFramerate = videoStream == null ? 0 : videoStream.Ave rageFrameRate ?? videoStream.AverageFrameRate ?? 0; | float videoFramerate = videoStream?.AverageFrameRate ?? videoStr eam?.RealFrameRate ?? 0; | |||
TransportStreamTimestamp? timestamp = videoStream == null ? Tran sportStreamTimestamp.None : item.Timestamp; | TransportStreamTimestamp? timestamp = videoStream == null ? Tran sportStreamTimestamp.None : item.Timestamp; | |||
int? numAudioStreams = item.GetStreamCount(MediaStreamType.Audio ); | int? numAudioStreams = item.GetStreamCount(MediaStreamType.Audio ); | |||
int? numVideoStreams = item.GetStreamCount(MediaStreamType.Video ); | int? numVideoStreams = item.GetStreamCount(MediaStreamType.Video ); | |||
transcodingProfiles = transcodingProfiles.ToLookup(transcodingPr ofile => | transcodingProfiles = transcodingProfiles.ToLookup(transcodingPr ofile => | |||
{ | { | |||
var videoCodecs = ContainerProfile.SplitValue(transcodingPro file.VideoCodec); | var videoCodecs = ContainerProfile.SplitValue(transcodingPro file.VideoCodec); | |||
if (ContainerProfile.ContainsContainer(videoCodecs, item.Vid eoStream?.Codec)) | if (ContainerProfile.ContainsContainer(videoCodecs, item.Vid eoStream?.Codec)) | |||
{ | { | |||
var videoCodec = transcodingProfile.VideoCodec; | var videoCodec = transcodingProfile.VideoCodec; | |||
var container = transcodingProfile.Container; | var container = transcodingProfile.Container; | |||
var appliedVideoConditions = options.Profile.CodecProfil es | var appliedVideoConditions = options.Profile.CodecProfil es | |||
.Where(i => i.Type == CodecType.Video && | .Where(i => i.Type == CodecType.Video && | |||
(string.IsNullOrEmpty(i.Codec) || string.Equals( i.Codec, videoStream?.Codec, StringComparison.OrdinalIgnoreCase)) && | ||||
i.ContainsAnyCodec(videoCodec, container) && | i.ContainsAnyCodec(videoCodec, container) && | |||
i.ApplyConditions.All(applyCondition => Conditio nProcessor.IsVideoConditionSatisfied(applyCondition, videoStream?.Width, videoSt ream?.Height, videoStream?.BitDepth, videoStream?.BitRate, videoStream?.Profile, videoStream?.VideoRangeType, videoStream?.Level, videoFramerate, videoStream?.P acketLength, timestamp, videoStream?.IsAnamorphic, videoStream?.IsInterlaced, vi deoStream?.RefFrames, numVideoStreams, numAudioStreams, videoStream?.CodecTag, v ideoStream?.IsAVC))) | i.ApplyConditions.All(applyCondition => Conditio nProcessor.IsVideoConditionSatisfied(applyCondition, videoStream?.Width, videoSt ream?.Height, videoStream?.BitDepth, videoStream?.BitRate, videoStream?.Profile, videoStream?.VideoRangeType, videoStream?.Level, videoFramerate, videoStream?.P acketLength, timestamp, videoStream?.IsAnamorphic, videoStream?.IsInterlaced, vi deoStream?.RefFrames, numVideoStreams, numAudioStreams, videoStream?.CodecTag, v ideoStream?.IsAVC))) | |||
.Select(i => | .Select(i => | |||
i.Conditions.All(condition => ConditionProcessor .IsVideoConditionSatisfied(condition, videoStream?.Width, videoStream?.Height, v ideoStream?.BitDepth, videoStream?.BitRate, videoStream?.Profile, videoStream?.V ideoRangeType, videoStream?.Level, videoFramerate, videoStream?.PacketLength, ti mestamp, videoStream?.IsAnamorphic, videoStream?.IsInterlaced, videoStream?.RefF rames, numVideoStreams, numAudioStreams, videoStream?.CodecTag, videoStream?.IsA VC))); | i.Conditions.All(condition => ConditionProcessor .IsVideoConditionSatisfied(condition, videoStream?.Width, videoStream?.Height, v ideoStream?.BitDepth, videoStream?.BitRate, videoStream?.Profile, videoStream?.V ideoRangeType, videoStream?.Level, videoFramerate, videoStream?.PacketLength, ti mestamp, videoStream?.IsAnamorphic, videoStream?.IsInterlaced, videoStream?.RefF rames, numVideoStreams, numAudioStreams, videoStream?.CodecTag, videoStream?.IsA VC))); | |||
// An empty appliedVideoConditions means that the codec has no conditions for the current video stream | // An empty appliedVideoConditions means that the codec has no conditions for the current video stream | |||
var conditionsSatisfied = appliedVideoConditions.All(sat isfied => satisfied); | var conditionsSatisfied = appliedVideoConditions.All(sat isfied => satisfied); | |||
return conditionsSatisfied ? 1 : 2; | return conditionsSatisfied ? 1 : 2; | |||
} | } | |||
skipping to change at line 773 | skipping to change at line 777 | |||
.SelectMany(lookup => lookup); | .SelectMany(lookup => lookup); | |||
} | } | |||
return transcodingProfiles.FirstOrDefault(); | return transcodingProfiles.FirstOrDefault(); | |||
} | } | |||
private void BuildStreamVideoItem(StreamInfo playlistItem, VideoOptions options, MediaSourceInfo item, MediaStream videoStream, MediaStream audioStream, IEnumerable<MediaStream> candidateAudioStreams, string container, string videoC odec, string audioCodec) | private void BuildStreamVideoItem(StreamInfo playlistItem, VideoOptions options, MediaSourceInfo item, MediaStream videoStream, MediaStream audioStream, IEnumerable<MediaStream> candidateAudioStreams, string container, string videoC odec, string audioCodec) | |||
{ | { | |||
// Prefer matching video codecs | // Prefer matching video codecs | |||
var videoCodecs = ContainerProfile.SplitValue(videoCodec); | var videoCodecs = ContainerProfile.SplitValue(videoCodec); | |||
// Enforce HLS video codec restrictions | ||||
if (string.Equals(playlistItem.SubProtocol, "hls", StringComparison. | ||||
OrdinalIgnoreCase)) | ||||
{ | ||||
videoCodecs = videoCodecs.Where(codec => _supportedHlsVideoCodec | ||||
s.Contains(codec)).ToArray(); | ||||
} | ||||
var directVideoCodec = ContainerProfile.ContainsContainer(videoCodec s, videoStream?.Codec) ? videoStream?.Codec : null; | var directVideoCodec = ContainerProfile.ContainsContainer(videoCodec s, videoStream?.Codec) ? videoStream?.Codec : null; | |||
if (directVideoCodec != null) | if (directVideoCodec != null) | |||
{ | { | |||
// merge directVideoCodec to videoCodecs | // merge directVideoCodec to videoCodecs | |||
Array.Resize(ref videoCodecs, videoCodecs.Length + 1); | Array.Resize(ref videoCodecs, videoCodecs.Length + 1); | |||
videoCodecs[^1] = directVideoCodec; | videoCodecs[^1] = directVideoCodec; | |||
} | } | |||
playlistItem.VideoCodecs = videoCodecs; | playlistItem.VideoCodecs = videoCodecs; | |||
skipping to change at line 808 | skipping to change at line 819 | |||
playlistItem.SetOption(qualifier, "profile", videoStream.Profile .ToLowerInvariant()); | playlistItem.SetOption(qualifier, "profile", videoStream.Profile .ToLowerInvariant()); | |||
} | } | |||
if (videoStream != null && videoStream.Level != 0) | if (videoStream != null && videoStream.Level != 0) | |||
{ | { | |||
playlistItem.SetOption(qualifier, "level", videoStream.Level.ToS tring()); | playlistItem.SetOption(qualifier, "level", videoStream.Level.ToS tring()); | |||
} | } | |||
// Prefer matching audio codecs, could do better here | // Prefer matching audio codecs, could do better here | |||
var audioCodecs = ContainerProfile.SplitValue(audioCodec); | var audioCodecs = ContainerProfile.SplitValue(audioCodec); | |||
// Enforce HLS audio codec restrictions | ||||
if (string.Equals(playlistItem.SubProtocol, "hls", StringComparison. | ||||
OrdinalIgnoreCase)) | ||||
{ | ||||
if (string.Equals(playlistItem.Container, "mp4", StringCompariso | ||||
n.OrdinalIgnoreCase)) | ||||
{ | ||||
audioCodecs = audioCodecs.Where(codec => _supportedHlsAudioC | ||||
odecsMp4.Contains(codec)).ToArray(); | ||||
} | ||||
else | ||||
{ | ||||
audioCodecs = audioCodecs.Where(codec => _supportedHlsAudioC | ||||
odecsTs.Contains(codec)).ToArray(); | ||||
} | ||||
} | ||||
var directAudioStream = candidateAudioStreams.FirstOrDefault(stream => ContainerProfile.ContainsContainer(audioCodecs, stream.Codec)); | var directAudioStream = candidateAudioStreams.FirstOrDefault(stream => ContainerProfile.ContainsContainer(audioCodecs, stream.Codec)); | |||
playlistItem.AudioCodecs = audioCodecs; | playlistItem.AudioCodecs = audioCodecs; | |||
if (directAudioStream != null) | if (directAudioStream != null) | |||
{ | { | |||
audioStream = directAudioStream; | audioStream = directAudioStream; | |||
playlistItem.AudioStreamIndex = audioStream.Index; | playlistItem.AudioStreamIndex = audioStream.Index; | |||
playlistItem.AudioCodecs = new[] { audioStream.Codec }; | playlistItem.AudioCodecs = new[] { audioStream.Codec }; | |||
// Copy matching audio codec options | // Copy matching audio codec options | |||
playlistItem.AudioSampleRate = audioStream.SampleRate; | playlistItem.AudioSampleRate = audioStream.SampleRate; | |||
skipping to change at line 853 | skipping to change at line 878 | |||
TransportStreamTimestamp? timestamp = videoStream == null ? Transpor tStreamTimestamp.None : item.Timestamp; | TransportStreamTimestamp? timestamp = videoStream == null ? Transpor tStreamTimestamp.None : item.Timestamp; | |||
int? packetLength = videoStream?.PacketLength; | int? packetLength = videoStream?.PacketLength; | |||
int? refFrames = videoStream?.RefFrames; | int? refFrames = videoStream?.RefFrames; | |||
int? numAudioStreams = item.GetStreamCount(MediaStreamType.Audio); | int? numAudioStreams = item.GetStreamCount(MediaStreamType.Audio); | |||
int? numVideoStreams = item.GetStreamCount(MediaStreamType.Video); | int? numVideoStreams = item.GetStreamCount(MediaStreamType.Video); | |||
var appliedVideoConditions = options.Profile.CodecProfiles | var appliedVideoConditions = options.Profile.CodecProfiles | |||
.Where(i => i.Type == CodecType.Video && | .Where(i => i.Type == CodecType.Video && | |||
(string.IsNullOrEmpty(i.Codec) || string.Equals(i.Codec, vid eoStream?.Codec, StringComparison.OrdinalIgnoreCase)) && | ||||
i.ContainsAnyCodec(videoCodec, container) && | i.ContainsAnyCodec(videoCodec, container) && | |||
i.ApplyConditions.All(applyCondition => ConditionProcessor.I sVideoConditionSatisfied(applyCondition, width, height, bitDepth, videoBitrate, videoProfile, videoRangeType, videoLevel, videoFramerate, packetLength, timestam p, isAnamorphic, isInterlaced, refFrames, numVideoStreams, numAudioStreams, vide oCodecTag, isAvc))); | i.ApplyConditions.All(applyCondition => ConditionProcessor.I sVideoConditionSatisfied(applyCondition, width, height, bitDepth, videoBitrate, videoProfile, videoRangeType, videoLevel, videoFramerate, packetLength, timestam p, isAnamorphic, isInterlaced, refFrames, numVideoStreams, numAudioStreams, vide oCodecTag, isAvc))); | |||
var isFirstAppliedCodecProfile = true; | var isFirstAppliedCodecProfile = true; | |||
foreach (var i in appliedVideoConditions) | foreach (var i in appliedVideoConditions) | |||
{ | { | |||
var transcodingVideoCodecs = ContainerProfile.SplitValue(videoCo dec); | var transcodingVideoCodecs = ContainerProfile.SplitValue(videoCo dec); | |||
foreach (var transcodingVideoCodec in transcodingVideoCodecs) | foreach (var transcodingVideoCodec in transcodingVideoCodecs) | |||
{ | { | |||
if (i.ContainsAnyCodec(transcodingVideoCodec, container)) | if (i.ContainsAnyCodec(transcodingVideoCodec, container)) | |||
{ | { | |||
skipping to change at line 885 | skipping to change at line 911 | |||
bool? isSecondaryAudio = audioStream == null ? null : item.IsSeconda ryAudio(audioStream); | bool? isSecondaryAudio = audioStream == null ? null : item.IsSeconda ryAudio(audioStream); | |||
int? inputAudioBitrate = audioStream == null ? null : audioStream.Bi tRate; | int? inputAudioBitrate = audioStream == null ? null : audioStream.Bi tRate; | |||
int? audioChannels = audioStream == null ? null : audioStream.Channe ls; | int? audioChannels = audioStream == null ? null : audioStream.Channe ls; | |||
string audioProfile = audioStream == null ? null : audioStream.Profi le; | string audioProfile = audioStream == null ? null : audioStream.Profi le; | |||
int? inputAudioSampleRate = audioStream == null ? null : audioStream .SampleRate; | int? inputAudioSampleRate = audioStream == null ? null : audioStream .SampleRate; | |||
int? inputAudioBitDepth = audioStream == null ? null : audioStream.B itDepth; | int? inputAudioBitDepth = audioStream == null ? null : audioStream.B itDepth; | |||
var appliedAudioConditions = options.Profile.CodecProfiles | var appliedAudioConditions = options.Profile.CodecProfiles | |||
.Where(i => i.Type == CodecType.VideoAudio && | .Where(i => i.Type == CodecType.VideoAudio && | |||
(string.IsNullOrEmpty(i.Codec) || string.Equals(i.Codec, aud ioStream?.Codec, StringComparison.OrdinalIgnoreCase)) && | ||||
i.ContainsAnyCodec(audioCodec, container) && | i.ContainsAnyCodec(audioCodec, container) && | |||
i.ApplyConditions.All(applyCondition => ConditionProcessor.I sVideoAudioConditionSatisfied(applyCondition, audioChannels, inputAudioBitrate, inputAudioSampleRate, inputAudioBitDepth, audioProfile, isSecondaryAudio))); | i.ApplyConditions.All(applyCondition => ConditionProcessor.I sVideoAudioConditionSatisfied(applyCondition, audioChannels, inputAudioBitrate, inputAudioSampleRate, inputAudioBitDepth, audioProfile, isSecondaryAudio))); | |||
isFirstAppliedCodecProfile = true; | isFirstAppliedCodecProfile = true; | |||
foreach (var i in appliedAudioConditions) | foreach (var i in appliedAudioConditions) | |||
{ | { | |||
var transcodingAudioCodecs = ContainerProfile.SplitValue(audioCo dec); | var transcodingAudioCodecs = ContainerProfile.SplitValue(audioCo dec); | |||
foreach (var transcodingAudioCodec in transcodingAudioCodecs) | foreach (var transcodingAudioCodec in transcodingAudioCodecs) | |||
{ | { | |||
if (i.ContainsAnyCodec(transcodingAudioCodec, container)) | if (i.ContainsAnyCodec(transcodingAudioCodec, container)) | |||
{ | { | |||
skipping to change at line 1117 | skipping to change at line 1144 | |||
profile.ContainerProfiles | profile.ContainerProfiles | |||
.Where(containerProfile => containerProfile.Type == DlnaProf ileType.Video && containerProfile.ContainsContainer(container)) | .Where(containerProfile => containerProfile.Type == DlnaProf ileType.Video && containerProfile.ContainsContainer(container)) | |||
.SelectMany(containerProfile => checkVideoConditions(contain erProfile.Conditions))); | .SelectMany(containerProfile => checkVideoConditions(contain erProfile.Conditions))); | |||
// Check video conditions | // Check video conditions | |||
var videoCodecProfileReasons = AggregateFailureConditions( | var videoCodecProfileReasons = AggregateFailureConditions( | |||
mediaSource, | mediaSource, | |||
profile, | profile, | |||
"VideoCodecProfile", | "VideoCodecProfile", | |||
profile.CodecProfiles | profile.CodecProfiles | |||
.Where(codecProfile => codecProfile.Type == CodecType.Video | .Where(codecProfile => codecProfile.Type == CodecType.Video | |||
&& codecProfile.ContainsAnyCodec(videoStream?.Codec, container) && | && | |||
(string.IsNullOrEmpty(codecProfile.Codec) || string.Equa | ||||
ls(codecProfile.Codec, videoStream?.Codec, StringComparison.OrdinalIgnoreCase)) | ||||
&& | ||||
codecProfile.ContainsAnyCodec(videoStream?.Codec, contai | ||||
ner) && | ||||
!checkVideoConditions(codecProfile.ApplyConditions).Any( )) | !checkVideoConditions(codecProfile.ApplyConditions).Any( )) | |||
.SelectMany(codecProfile => checkVideoConditions(codecProfil e.Conditions))); | .SelectMany(codecProfile => checkVideoConditions(codecProfil e.Conditions))); | |||
// Check audiocandidates profile conditions | // Check audiocandidates profile conditions | |||
var audioStreamMatches = candidateAudioStreams.ToDictionary(s => s, audioStream => CheckVideoAudioStreamDirectPlay(options, mediaSource, container, audioStream)); | var audioStreamMatches = candidateAudioStreams.ToDictionary(s => s, audioStream => CheckVideoAudioStreamDirectPlay(options, mediaSource, container, audioStream)); | |||
TranscodeReason subtitleProfileReasons = 0; | TranscodeReason subtitleProfileReasons = 0; | |||
if (subtitleStream != null) | if (subtitleStream != null) | |||
{ | { | |||
var subtitleProfile = GetSubtitleProfile(mediaSource, subtitleSt ream, options.Profile.SubtitleProfiles, PlayMethod.DirectPlay, _transcoderSuppor t, container, null); | var subtitleProfile = GetSubtitleProfile(mediaSource, subtitleSt ream, options.Profile.SubtitleProfiles, PlayMethod.DirectPlay, _transcoderSuppor t, container, null); | |||
skipping to change at line 1538 | skipping to change at line 1567 | |||
string container, | string container, | |||
string codec, | string codec, | |||
int? audioChannels, | int? audioChannels, | |||
int? audioBitrate, | int? audioBitrate, | |||
int? audioSampleRate, | int? audioSampleRate, | |||
int? audioBitDepth, | int? audioBitDepth, | |||
string audioProfile, | string audioProfile, | |||
bool? isSecondaryAudio) | bool? isSecondaryAudio) | |||
{ | { | |||
return codecProfiles | return codecProfiles | |||
.Where(profile => profile.Type == CodecType.VideoAudio && profil | .Where(profile => profile.Type == CodecType.VideoAudio && | |||
e.ContainsAnyCodec(codec, container) && | (string.IsNullOrEmpty(profile.Codec) || string.Equals(profil | |||
e.Codec, codec, StringComparison.OrdinalIgnoreCase)) && | ||||
profile.ContainsAnyCodec(codec, container) && | ||||
profile.ApplyConditions.All(applyCondition => ConditionProce ssor.IsVideoAudioConditionSatisfied(applyCondition, audioChannels, audioBitrate, audioSampleRate, audioBitDepth, audioProfile, isSecondaryAudio))) | profile.ApplyConditions.All(applyCondition => ConditionProce ssor.IsVideoAudioConditionSatisfied(applyCondition, audioChannels, audioBitrate, audioSampleRate, audioBitDepth, audioProfile, isSecondaryAudio))) | |||
.SelectMany(profile => profile.Conditions) | .SelectMany(profile => profile.Conditions) | |||
.Where(condition => !ConditionProcessor.IsVideoAudioConditionSat isfied(condition, audioChannels, audioBitrate, audioSampleRate, audioBitDepth, a udioProfile, isSecondaryAudio)); | .Where(condition => !ConditionProcessor.IsVideoAudioConditionSat isfied(condition, audioChannels, audioBitrate, audioSampleRate, audioBitDepth, a udioProfile, isSecondaryAudio)); | |||
} | } | |||
private static IEnumerable<ProfileCondition> GetProfileConditionsForAudi o( | private static IEnumerable<ProfileCondition> GetProfileConditionsForAudi o( | |||
IEnumerable<CodecProfile> codecProfiles, | IEnumerable<CodecProfile> codecProfiles, | |||
string container, | string container, | |||
string codec, | string codec, | |||
int? audioChannels, | int? audioChannels, | |||
int? audioBitrate, | int? audioBitrate, | |||
int? audioSampleRate, | int? audioSampleRate, | |||
int? audioBitDepth, | int? audioBitDepth, | |||
bool checkConditions) | bool checkConditions) | |||
{ | { | |||
var conditions = codecProfiles | var conditions = codecProfiles | |||
.Where(profile => profile.Type == CodecType.Audio && profile.Con | .Where(profile => profile.Type == CodecType.Audio && | |||
tainsAnyCodec(codec, container) && | (string.IsNullOrEmpty(profile.Codec) || string.Equals(profil | |||
e.Codec, codec, StringComparison.OrdinalIgnoreCase)) && | ||||
profile.ContainsAnyCodec(codec, container) && | ||||
profile.ApplyConditions.All(applyCondition => ConditionProce ssor.IsAudioConditionSatisfied(applyCondition, audioChannels, audioBitrate, audi oSampleRate, audioBitDepth))) | profile.ApplyConditions.All(applyCondition => ConditionProce ssor.IsAudioConditionSatisfied(applyCondition, audioChannels, audioBitrate, audi oSampleRate, audioBitDepth))) | |||
.SelectMany(profile => profile.Conditions); | .SelectMany(profile => profile.Conditions); | |||
if (!checkConditions) | if (!checkConditions) | |||
{ | { | |||
return conditions; | return conditions; | |||
} | } | |||
return conditions.Where(condition => !ConditionProcessor.IsAudioCond itionSatisfied(condition, audioChannels, audioBitrate, audioSampleRate, audioBit Depth)); | return conditions.Where(condition => !ConditionProcessor.IsAudioCond itionSatisfied(condition, audioChannels, audioBitrate, audioSampleRate, audioBit Depth)); | |||
} | } | |||
End of changes. 10 change blocks. | ||||
7 lines changed or deleted | 52 lines changed or added |