|
@@ -1,14 +1,38 @@
|
|
|
-#pragma warning disable CS1591
|
|
|
-
|
|
|
using System;
|
|
|
using System.Globalization;
|
|
|
+using Jellyfin.Data.Enums;
|
|
|
using Jellyfin.Extensions;
|
|
|
using MediaBrowser.Model.MediaInfo;
|
|
|
|
|
|
namespace MediaBrowser.Model.Dlna
|
|
|
{
|
|
|
+ /// <summary>
|
|
|
+ /// The condition processor.
|
|
|
+ /// </summary>
|
|
|
public static class ConditionProcessor
|
|
|
{
|
|
|
+ /// <summary>
|
|
|
+ /// Checks if a video condition is satisfied.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="condition">The <see cref="ProfileCondition"/>.</param>
|
|
|
+ /// <param name="width">The width.</param>
|
|
|
+ /// <param name="height">The height.</param>
|
|
|
+ /// <param name="videoBitDepth">The bit depth.</param>
|
|
|
+ /// <param name="videoBitrate">The bitrate.</param>
|
|
|
+ /// <param name="videoProfile">The video profile.</param>
|
|
|
+ /// <param name="videoRangeType">The <see cref="VideoRangeType"/>.</param>
|
|
|
+ /// <param name="videoLevel">The video level.</param>
|
|
|
+ /// <param name="videoFramerate">The framerate.</param>
|
|
|
+ /// <param name="packetLength">The packet length.</param>
|
|
|
+ /// <param name="timestamp">The <see cref="TransportStreamTimestamp"/>.</param>
|
|
|
+ /// <param name="isAnamorphic">A value indicating whether tthe video is anamorphic.</param>
|
|
|
+ /// <param name="isInterlaced">A value indicating whether tthe video is interlaced.</param>
|
|
|
+ /// <param name="refFrames">The reference frames.</param>
|
|
|
+ /// <param name="numVideoStreams">The number of video streams.</param>
|
|
|
+ /// <param name="numAudioStreams">The number of audio streams.</param>
|
|
|
+ /// <param name="videoCodecTag">The video codec tag.</param>
|
|
|
+ /// <param name="isAvc">A value indicating whether the video is AVC.</param>
|
|
|
+ /// <returns><b>True</b> if the condition is satisfied.</returns>
|
|
|
public static bool IsVideoConditionSatisfied(
|
|
|
ProfileCondition condition,
|
|
|
int? width,
|
|
@@ -16,7 +40,7 @@ namespace MediaBrowser.Model.Dlna
|
|
|
int? videoBitDepth,
|
|
|
int? videoBitrate,
|
|
|
string? videoProfile,
|
|
|
- string? videoRangeType,
|
|
|
+ VideoRangeType? videoRangeType,
|
|
|
double? videoLevel,
|
|
|
float? videoFramerate,
|
|
|
int? packetLength,
|
|
@@ -70,6 +94,13 @@ namespace MediaBrowser.Model.Dlna
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// Checks if a image condition is satisfied.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="condition">The <see cref="ProfileCondition"/>.</param>
|
|
|
+ /// <param name="width">The width.</param>
|
|
|
+ /// <param name="height">The height.</param>
|
|
|
+ /// <returns><b>True</b> if the condition is satisfied.</returns>
|
|
|
public static bool IsImageConditionSatisfied(ProfileCondition condition, int? width, int? height)
|
|
|
{
|
|
|
switch (condition.Property)
|
|
@@ -83,6 +114,15 @@ namespace MediaBrowser.Model.Dlna
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// Checks if an audio condition is satisfied.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="condition">The <see cref="ProfileCondition"/>.</param>
|
|
|
+ /// <param name="audioChannels">The channel count.</param>
|
|
|
+ /// <param name="audioBitrate">The bitrate.</param>
|
|
|
+ /// <param name="audioSampleRate">The sample rate.</param>
|
|
|
+ /// <param name="audioBitDepth">The bit depth.</param>
|
|
|
+ /// <returns><b>True</b> if the condition is satisfied.</returns>
|
|
|
public static bool IsAudioConditionSatisfied(ProfileCondition condition, int? audioChannels, int? audioBitrate, int? audioSampleRate, int? audioBitDepth)
|
|
|
{
|
|
|
switch (condition.Property)
|
|
@@ -100,6 +140,17 @@ namespace MediaBrowser.Model.Dlna
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// Checks if an audio condition is satisfied for a video.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="condition">The <see cref="ProfileCondition"/>.</param>
|
|
|
+ /// <param name="audioChannels">The channel count.</param>
|
|
|
+ /// <param name="audioBitrate">The bitrate.</param>
|
|
|
+ /// <param name="audioSampleRate">The sample rate.</param>
|
|
|
+ /// <param name="audioBitDepth">The bit depth.</param>
|
|
|
+ /// <param name="audioProfile">The profile.</param>
|
|
|
+ /// <param name="isSecondaryTrack">A value indicating whether the audio is a secondary track.</param>
|
|
|
+ /// <returns><b>True</b> if the condition is satisfied.</returns>
|
|
|
public static bool IsVideoAudioConditionSatisfied(
|
|
|
ProfileCondition condition,
|
|
|
int? audioChannels,
|
|
@@ -281,5 +332,41 @@ namespace MediaBrowser.Model.Dlna
|
|
|
throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ private static bool IsConditionSatisfied(ProfileCondition condition, VideoRangeType? currentValue)
|
|
|
+ {
|
|
|
+ if (!currentValue.HasValue || currentValue.Equals(VideoRangeType.Unknown))
|
|
|
+ {
|
|
|
+ // If the value is unknown, it satisfies if not marked as required
|
|
|
+ return !condition.IsRequired;
|
|
|
+ }
|
|
|
+
|
|
|
+ var conditionType = condition.Condition;
|
|
|
+ if (conditionType == ProfileConditionType.EqualsAny)
|
|
|
+ {
|
|
|
+ foreach (var singleConditionString in condition.Value.AsSpan().Split('|'))
|
|
|
+ {
|
|
|
+ if (Enum.TryParse(singleConditionString, true, out VideoRangeType conditionValue)
|
|
|
+ && conditionValue.Equals(currentValue))
|
|
|
+ {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Enum.TryParse(condition.Value, true, out VideoRangeType expected))
|
|
|
+ {
|
|
|
+ return conditionType switch
|
|
|
+ {
|
|
|
+ ProfileConditionType.Equals => currentValue.Value == expected,
|
|
|
+ ProfileConditionType.NotEquals => currentValue.Value != expected,
|
|
|
+ _ => throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition)
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
}
|