"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "MediaBrowser.Model/Dlna/StreamBuilder.cs" between
jellyfin-10.8.9.tar.gz and jellyfin-10.8.10.tar.gz

About: Jellyfin is a suite of multimedia applications that puts you in control of managing and streaming your digital media.

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

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)