diff --git a/MediaBrowser.Model/Dlna/CodecProfile.cs b/MediaBrowser.Model/Dlna/CodecProfile.cs index f857bf3a8..07c1a29a4 100644 --- a/MediaBrowser.Model/Dlna/CodecProfile.cs +++ b/MediaBrowser.Model/Dlna/CodecProfile.cs @@ -28,24 +28,28 @@ namespace MediaBrowser.Model.Dlna [XmlAttribute("container")] public string Container { get; set; } + [XmlAttribute("subcontainer")] + public string SubContainer { get; set; } + public string[] GetCodecs() { return ContainerProfile.SplitValue(Codec); } - private bool ContainsContainer(string container) + private bool ContainsContainer(string container, bool useSubContainer = false) { - return ContainerProfile.ContainsContainer(Container, container); + var containerToCheck = useSubContainer && string.Equals(Container, "hls", StringComparison.OrdinalIgnoreCase) ? SubContainer : Container; + return ContainerProfile.ContainsContainer(containerToCheck, container); } - public bool ContainsAnyCodec(string codec, string container) + public bool ContainsAnyCodec(string codec, string container, bool useSubContainer = false) { - return ContainsAnyCodec(ContainerProfile.SplitValue(codec), container); + return ContainsAnyCodec(ContainerProfile.SplitValue(codec), container, useSubContainer); } - public bool ContainsAnyCodec(string[] codec, string container) + public bool ContainsAnyCodec(string[] codec, string container, bool useSubContainer = false) { - if (!ContainsContainer(container)) + if (!ContainsContainer(container, useSubContainer)) { return false; } diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index 1101c76ea..7f387bfaa 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -962,9 +962,11 @@ namespace MediaBrowser.Model.Dlna int? numAudioStreams = item.GetStreamCount(MediaStreamType.Audio); int? numVideoStreams = item.GetStreamCount(MediaStreamType.Video); + var useSubContainer = playlistItem.SubProtocol == MediaStreamProtocol.hls; + var appliedVideoConditions = options.Profile.CodecProfiles .Where(i => i.Type == CodecType.Video && - i.ContainsAnyCodec(videoStream?.Codec, container) && + i.ContainsAnyCodec(videoStream?.Codec, container, useSubContainer) && i.ApplyConditions.All(applyCondition => ConditionProcessor.IsVideoConditionSatisfied(applyCondition, width, height, bitDepth, videoBitrate, videoProfile, videoRangeType, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, isInterlaced, refFrames, numVideoStreams, numAudioStreams, videoCodecTag, isAvc))) // Reverse codec profiles for backward compatibility - first codec profile has higher priority .Reverse(); @@ -974,7 +976,7 @@ namespace MediaBrowser.Model.Dlna var transcodingVideoCodecs = ContainerProfile.SplitValue(videoCodec); foreach (var transcodingVideoCodec in transcodingVideoCodecs) { - if (i.ContainsAnyCodec(transcodingVideoCodec, container)) + if (i.ContainsAnyCodec(transcodingVideoCodec, container, useSubContainer)) { ApplyTranscodingConditions(playlistItem, i.Conditions, transcodingVideoCodec, true, true); continue;