aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Model/Dlna/ConditionProcessor.cs
diff options
context:
space:
mode:
authorAndrew Rabert <ar@nullsum.net>2018-12-27 18:27:57 -0500
committerAndrew Rabert <ar@nullsum.net>2018-12-27 18:27:57 -0500
commita86b71899ec52c44ddc6c3018e8cc5e9d7ff4d62 (patch)
treea74f6ea4a8abfa1664a605d31d48bc38245ccf58 /MediaBrowser.Model/Dlna/ConditionProcessor.cs
parent9bac3ac616b01f67db98381feb09d34ebe821f9a (diff)
Add GPL modules
Diffstat (limited to 'MediaBrowser.Model/Dlna/ConditionProcessor.cs')
-rw-r--r--MediaBrowser.Model/Dlna/ConditionProcessor.cs284
1 files changed, 284 insertions, 0 deletions
diff --git a/MediaBrowser.Model/Dlna/ConditionProcessor.cs b/MediaBrowser.Model/Dlna/ConditionProcessor.cs
new file mode 100644
index 000000000..a550ee982
--- /dev/null
+++ b/MediaBrowser.Model/Dlna/ConditionProcessor.cs
@@ -0,0 +1,284 @@
+using MediaBrowser.Model.Extensions;
+using MediaBrowser.Model.MediaInfo;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+
+namespace MediaBrowser.Model.Dlna
+{
+ public class ConditionProcessor
+ {
+ public bool IsVideoConditionSatisfied(ProfileCondition condition,
+ int? width,
+ int? height,
+ int? videoBitDepth,
+ int? videoBitrate,
+ string videoProfile,
+ double? videoLevel,
+ float? videoFramerate,
+ int? packetLength,
+ TransportStreamTimestamp? timestamp,
+ bool? isAnamorphic,
+ bool? isInterlaced,
+ int? refFrames,
+ int? numVideoStreams,
+ int? numAudioStreams,
+ string videoCodecTag,
+ bool? isAvc )
+ {
+ switch (condition.Property)
+ {
+ case ProfileConditionValue.IsInterlaced:
+ return IsConditionSatisfied(condition, isInterlaced);
+ case ProfileConditionValue.IsAnamorphic:
+ return IsConditionSatisfied(condition, isAnamorphic);
+ case ProfileConditionValue.IsAvc:
+ return IsConditionSatisfied(condition, isAvc);
+ case ProfileConditionValue.VideoFramerate:
+ return IsConditionSatisfied(condition, videoFramerate);
+ case ProfileConditionValue.VideoLevel:
+ return IsConditionSatisfied(condition, videoLevel);
+ case ProfileConditionValue.VideoProfile:
+ return IsConditionSatisfied(condition, videoProfile);
+ case ProfileConditionValue.VideoCodecTag:
+ return IsConditionSatisfied(condition, videoCodecTag);
+ case ProfileConditionValue.PacketLength:
+ return IsConditionSatisfied(condition, packetLength);
+ case ProfileConditionValue.VideoBitDepth:
+ return IsConditionSatisfied(condition, videoBitDepth);
+ case ProfileConditionValue.VideoBitrate:
+ return IsConditionSatisfied(condition, videoBitrate);
+ case ProfileConditionValue.Height:
+ return IsConditionSatisfied(condition, height);
+ case ProfileConditionValue.Width:
+ return IsConditionSatisfied(condition, width);
+ case ProfileConditionValue.RefFrames:
+ return IsConditionSatisfied(condition, refFrames);
+ case ProfileConditionValue.NumAudioStreams:
+ return IsConditionSatisfied(condition, numAudioStreams);
+ case ProfileConditionValue.NumVideoStreams:
+ return IsConditionSatisfied(condition, numVideoStreams);
+ case ProfileConditionValue.VideoTimestamp:
+ return IsConditionSatisfied(condition, timestamp);
+ default:
+ return true;
+ }
+ }
+
+ public bool IsImageConditionSatisfied(ProfileCondition condition, int? width, int? height)
+ {
+ switch (condition.Property)
+ {
+ case ProfileConditionValue.Height:
+ return IsConditionSatisfied(condition, height);
+ case ProfileConditionValue.Width:
+ return IsConditionSatisfied(condition, width);
+ default:
+ throw new ArgumentException("Unexpected condition on image file: " + condition.Property);
+ }
+ }
+
+ public bool IsAudioConditionSatisfied(ProfileCondition condition, int? audioChannels, int? audioBitrate, int? audioSampleRate, int? audioBitDepth)
+ {
+ switch (condition.Property)
+ {
+ case ProfileConditionValue.AudioBitrate:
+ return IsConditionSatisfied(condition, audioBitrate);
+ case ProfileConditionValue.AudioChannels:
+ return IsConditionSatisfied(condition, audioChannels);
+ case ProfileConditionValue.AudioSampleRate:
+ return IsConditionSatisfied(condition, audioSampleRate);
+ case ProfileConditionValue.AudioBitDepth:
+ return IsConditionSatisfied(condition, audioBitDepth);
+ default:
+ throw new ArgumentException("Unexpected condition on audio file: " + condition.Property);
+ }
+ }
+
+ public bool IsVideoAudioConditionSatisfied(ProfileCondition condition,
+ int? audioChannels,
+ int? audioBitrate,
+ int? audioSampleRate,
+ int? audioBitDepth,
+ string audioProfile,
+ bool? isSecondaryTrack)
+ {
+ switch (condition.Property)
+ {
+ case ProfileConditionValue.AudioProfile:
+ return IsConditionSatisfied(condition, audioProfile);
+ case ProfileConditionValue.AudioBitrate:
+ return IsConditionSatisfied(condition, audioBitrate);
+ case ProfileConditionValue.AudioChannels:
+ return IsConditionSatisfied(condition, audioChannels);
+ case ProfileConditionValue.IsSecondaryAudio:
+ return IsConditionSatisfied(condition, isSecondaryTrack);
+ case ProfileConditionValue.AudioSampleRate:
+ return IsConditionSatisfied(condition, audioSampleRate);
+ case ProfileConditionValue.AudioBitDepth:
+ return IsConditionSatisfied(condition, audioBitDepth);
+ default:
+ throw new ArgumentException("Unexpected condition on audio file: " + condition.Property);
+ }
+ }
+
+ private bool IsConditionSatisfied(ProfileCondition condition, int? currentValue)
+ {
+ if (!currentValue.HasValue)
+ {
+ // If the value is unknown, it satisfies if not marked as required
+ return !condition.IsRequired;
+ }
+
+ int expected;
+ if (int.TryParse(condition.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out expected))
+ {
+ switch (condition.Condition)
+ {
+ case ProfileConditionType.Equals:
+ case ProfileConditionType.EqualsAny:
+ return currentValue.Value.Equals(expected);
+ case ProfileConditionType.GreaterThanEqual:
+ return currentValue.Value >= expected;
+ case ProfileConditionType.LessThanEqual:
+ return currentValue.Value <= expected;
+ case ProfileConditionType.NotEquals:
+ return !currentValue.Value.Equals(expected);
+ default:
+ throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition);
+ }
+ }
+
+ return false;
+ }
+
+ private bool IsConditionSatisfied(ProfileCondition condition, string currentValue)
+ {
+ if (string.IsNullOrEmpty(currentValue))
+ {
+ // If the value is unknown, it satisfies if not marked as required
+ return !condition.IsRequired;
+ }
+
+ string expected = condition.Value;
+
+ switch (condition.Condition)
+ {
+ case ProfileConditionType.EqualsAny:
+ {
+ return ListHelper.ContainsIgnoreCase(expected.Split('|'), currentValue);
+ }
+ case ProfileConditionType.Equals:
+ return StringHelper.EqualsIgnoreCase(currentValue, expected);
+ case ProfileConditionType.NotEquals:
+ return !StringHelper.EqualsIgnoreCase(currentValue, expected);
+ default:
+ throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition);
+ }
+ }
+
+ private bool IsConditionSatisfied(ProfileCondition condition, bool? currentValue)
+ {
+ if (!currentValue.HasValue)
+ {
+ // If the value is unknown, it satisfies if not marked as required
+ return !condition.IsRequired;
+ }
+
+ bool expected;
+ if (bool.TryParse(condition.Value, out expected))
+ {
+ switch (condition.Condition)
+ {
+ case ProfileConditionType.Equals:
+ return currentValue.Value == expected;
+ case ProfileConditionType.NotEquals:
+ return currentValue.Value != expected;
+ default:
+ throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition);
+ }
+ }
+
+ return false;
+ }
+
+ private bool IsConditionSatisfied(ProfileCondition condition, float currentValue)
+ {
+ if (currentValue <= 0)
+ {
+ // If the value is unknown, it satisfies if not marked as required
+ return !condition.IsRequired;
+ }
+
+ float expected;
+ if (float.TryParse(condition.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out expected))
+ {
+ switch (condition.Condition)
+ {
+ case ProfileConditionType.Equals:
+ return currentValue.Equals(expected);
+ case ProfileConditionType.GreaterThanEqual:
+ return currentValue >= expected;
+ case ProfileConditionType.LessThanEqual:
+ return currentValue <= expected;
+ case ProfileConditionType.NotEquals:
+ return !currentValue.Equals(expected);
+ default:
+ throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition);
+ }
+ }
+
+ return false;
+ }
+
+ private bool IsConditionSatisfied(ProfileCondition condition, double? currentValue)
+ {
+ if (!currentValue.HasValue)
+ {
+ // If the value is unknown, it satisfies if not marked as required
+ return !condition.IsRequired;
+ }
+
+ double expected;
+ if (double.TryParse(condition.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out expected))
+ {
+ switch (condition.Condition)
+ {
+ case ProfileConditionType.Equals:
+ return currentValue.Value.Equals(expected);
+ case ProfileConditionType.GreaterThanEqual:
+ return currentValue.Value >= expected;
+ case ProfileConditionType.LessThanEqual:
+ return currentValue.Value <= expected;
+ case ProfileConditionType.NotEquals:
+ return !currentValue.Value.Equals(expected);
+ default:
+ throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition);
+ }
+ }
+
+ return false;
+ }
+
+ private bool IsConditionSatisfied(ProfileCondition condition, TransportStreamTimestamp? timestamp)
+ {
+ if (!timestamp.HasValue)
+ {
+ // If the value is unknown, it satisfies if not marked as required
+ return !condition.IsRequired;
+ }
+
+ TransportStreamTimestamp expected = (TransportStreamTimestamp)Enum.Parse(typeof(TransportStreamTimestamp), condition.Value, true);
+
+ switch (condition.Condition)
+ {
+ case ProfileConditionType.Equals:
+ return timestamp == expected;
+ case ProfileConditionType.NotEquals:
+ return timestamp != expected;
+ default:
+ throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition);
+ }
+ }
+ }
+}