diff options
Diffstat (limited to 'MediaBrowser.Model')
| -rw-r--r-- | MediaBrowser.Model/Dlna/StreamBuilder.cs | 86 | ||||
| -rw-r--r-- | MediaBrowser.Model/Dlna/StreamInfo.cs | 68 |
2 files changed, 136 insertions, 18 deletions
diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index a5ec0f26c..130b4c08e 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -406,7 +406,7 @@ namespace MediaBrowser.Model.Dlna } } - ApplyTranscodingConditions(playlistItem, audioTranscodingConditions); + ApplyTranscodingConditions(playlistItem, audioTranscodingConditions, null, false); // Honor requested max channels if (options.MaxAudioChannels.HasValue) @@ -769,7 +769,7 @@ namespace MediaBrowser.Model.Dlna playlistItem.AudioStreamIndex = audioStreamIndex; ConditionProcessor conditionProcessor = new ConditionProcessor(); - var videoTranscodingConditions = new List<ProfileCondition>(); + var isFirstAppliedCodecProfile = true; foreach (CodecProfile i in options.Profile.CodecProfiles) { if (i.Type == CodecType.Video && i.ContainsCodec(transcodingProfile.VideoCodec, transcodingProfile.Container)) @@ -786,7 +786,7 @@ namespace MediaBrowser.Model.Dlna if (!conditionProcessor.IsVideoAudioConditionSatisfied(applyCondition, audioChannels, inputAudioBitrate, inputAudioSampleRate, inputAudioBitDepth, audioProfile, isSecondaryAudio)) { - LogConditionFailure(options.Profile, "AudioCodecProfile", applyCondition, item); + LogConditionFailure(options.Profile, "VideoAudioCodecProfile", applyCondition, item); applyConditions = false; break; } @@ -794,15 +794,14 @@ namespace MediaBrowser.Model.Dlna if (applyConditions) { - foreach (ProfileCondition c in i.Conditions) + foreach (var transcodingVideoCodec in ContainerProfile.SplitValue(transcodingProfile.VideoCodec)) { - videoTranscodingConditions.Add(c); + ApplyTranscodingConditions(playlistItem, i.Conditions, transcodingVideoCodec, !isFirstAppliedCodecProfile); + isFirstAppliedCodecProfile = false; } - break; } } } - ApplyTranscodingConditions(playlistItem, videoTranscodingConditions); var audioTranscodingConditions = new List<ProfileCondition>(); foreach (CodecProfile i in options.Profile.CodecProfiles) @@ -878,7 +877,7 @@ namespace MediaBrowser.Model.Dlna } // Do this after initial values are set to account for greater than/less than conditions - ApplyTranscodingConditions(playlistItem, audioTranscodingConditions); + ApplyTranscodingConditions(playlistItem, audioTranscodingConditions, null, false); } playlistItem.TranscodeReasons = transcodeReasons; @@ -1407,7 +1406,7 @@ namespace MediaBrowser.Model.Dlna } } - private void ApplyTranscodingConditions(StreamInfo item, IEnumerable<ProfileCondition> conditions) + private void ApplyTranscodingConditions(StreamInfo item, IEnumerable<ProfileCondition> conditions, string qualifier, bool qualifiedOnly) { foreach (ProfileCondition condition in conditions) { @@ -1428,6 +1427,11 @@ namespace MediaBrowser.Model.Dlna { case ProfileConditionValue.AudioBitrate: { + if (qualifiedOnly) + { + continue; + } + int num; if (int.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out num)) { @@ -1448,6 +1452,11 @@ namespace MediaBrowser.Model.Dlna } case ProfileConditionValue.AudioChannels: { + if (qualifiedOnly) + { + continue; + } + int num; if (int.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out num)) { @@ -1468,6 +1477,11 @@ namespace MediaBrowser.Model.Dlna } case ProfileConditionValue.IsAvc: { + if (qualifiedOnly) + { + continue; + } + bool isAvc; if (bool.TryParse(value, out isAvc)) { @@ -1484,6 +1498,11 @@ namespace MediaBrowser.Model.Dlna } case ProfileConditionValue.IsAnamorphic: { + if (qualifiedOnly) + { + continue; + } + bool isAnamorphic; if (bool.TryParse(value, out isAnamorphic)) { @@ -1500,16 +1519,21 @@ namespace MediaBrowser.Model.Dlna } case ProfileConditionValue.IsInterlaced: { + if (string.IsNullOrWhiteSpace(qualifier)) + { + continue; + } + bool isInterlaced; if (bool.TryParse(value, out isInterlaced)) { if (!isInterlaced && condition.Condition == ProfileConditionType.Equals) { - item.DeInterlace = true; + item.SetOption(qualifier, "deinterlace", "true"); } else if (isInterlaced && condition.Condition == ProfileConditionType.NotEquals) { - item.DeInterlace = true; + item.SetOption(qualifier, "deinterlace", "true"); } } break; @@ -1527,6 +1551,11 @@ namespace MediaBrowser.Model.Dlna } case ProfileConditionValue.RefFrames: { + if (qualifiedOnly) + { + continue; + } + int num; if (int.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out num)) { @@ -1547,6 +1576,11 @@ namespace MediaBrowser.Model.Dlna } case ProfileConditionValue.VideoBitDepth: { + if (qualifiedOnly) + { + continue; + } + int num; if (int.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out num)) { @@ -1567,11 +1601,21 @@ namespace MediaBrowser.Model.Dlna } case ProfileConditionValue.VideoProfile: { + if (qualifiedOnly) + { + continue; + } + item.VideoProfile = (value ?? string.Empty).Split('|')[0]; break; } case ProfileConditionValue.Height: { + if (qualifiedOnly) + { + continue; + } + int num; if (int.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out num)) { @@ -1592,6 +1636,11 @@ namespace MediaBrowser.Model.Dlna } case ProfileConditionValue.VideoBitrate: { + if (qualifiedOnly) + { + continue; + } + int num; if (int.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out num)) { @@ -1612,6 +1661,11 @@ namespace MediaBrowser.Model.Dlna } case ProfileConditionValue.VideoFramerate: { + if (qualifiedOnly) + { + continue; + } + float num; if (float.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out num)) { @@ -1632,6 +1686,11 @@ namespace MediaBrowser.Model.Dlna } case ProfileConditionValue.VideoLevel: { + if (qualifiedOnly) + { + continue; + } + int num; if (int.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out num)) { @@ -1652,6 +1711,11 @@ namespace MediaBrowser.Model.Dlna } case ProfileConditionValue.Width: { + if (qualifiedOnly) + { + continue; + } + int num; if (int.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out num)) { diff --git a/MediaBrowser.Model/Dlna/StreamInfo.cs b/MediaBrowser.Model/Dlna/StreamInfo.cs index c63e74eaf..3e7ff9c3d 100644 --- a/MediaBrowser.Model/Dlna/StreamInfo.cs +++ b/MediaBrowser.Model/Dlna/StreamInfo.cs @@ -22,6 +22,33 @@ namespace MediaBrowser.Model.Dlna VideoCodecs = new string[] { }; SubtitleCodecs = new string[] { }; TranscodeReasons = new List<TranscodeReason>(); + StreamOptions = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); + } + + public void SetOption(string qualifier, string name, string value) + { + SetOption(qualifier + "-" + name, value); + } + + public void SetOption(string name, string value) + { + StreamOptions[name] = value; + } + + public string GetOption(string qualifier, string name) + { + return GetOption(qualifier + "-" + name); + } + + public string GetOption(string name) + { + string value; + if (StreamOptions.TryGetValue(name, out value)) + { + return value; + } + + return null; } public string ItemId { get; set; } @@ -44,7 +71,6 @@ namespace MediaBrowser.Model.Dlna public bool BreakOnNonKeyFrames { get; set; } public bool RequireAvc { get; set; } - public bool DeInterlace { get; set; } public bool RequireNonAnamorphic { get; set; } public bool CopyTimestamps { get; set; } public bool EnableSubtitlesInManifest { get; set; } @@ -92,6 +118,8 @@ namespace MediaBrowser.Model.Dlna public List<MediaSourceInfo> AllMediaSources { get; set; } public List<TranscodeReason> TranscodeReasons { get; set; } + public Dictionary<string, string> StreamOptions { get; private set; } + public string MediaSourceId { get @@ -282,7 +310,16 @@ namespace MediaBrowser.Model.Dlna list.Add(new NameValuePair("SubtitleCodec", item.SubtitleStreamIndex.HasValue && item.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Embed ? subtitleCodecs : string.Empty)); list.Add(new NameValuePair("RequireNonAnamorphic", item.RequireNonAnamorphic.ToString().ToLower())); - list.Add(new NameValuePair("DeInterlace", item.DeInterlace.ToString().ToLower())); + + if (isDlna) + { + // hack alert + // dlna needs to be update to support the qualified params + var deinterlace = string.Equals(item.GetOption("h264", "deinterlace"), "true", StringComparison.OrdinalIgnoreCase) || + string.Equals(item.GetOption("mpeg2video", "deinterlace"), "true", StringComparison.OrdinalIgnoreCase); + + list.Add(new NameValuePair("DeInterlace", deinterlace.ToString().ToLower())); + } if (!isDlna && isHls) { @@ -306,6 +343,19 @@ namespace MediaBrowser.Model.Dlna list.Add(new NameValuePair("TranscodeReasons", string.Join(",", item.TranscodeReasons.Distinct().Select(i => i.ToString()).ToArray()))); } + if (!isDlna) + { + foreach (var pair in item.StreamOptions) + { + if (string.IsNullOrWhiteSpace(pair.Value)) + { + continue; + } + + list.Add(new NameValuePair(pair.Key, pair.Value)); + } + } + return list; } @@ -675,10 +725,10 @@ namespace MediaBrowser.Model.Dlna return VideoCodecs.Length == 0 ? null : VideoCodecs[0]; } } - + /// <summary> - /// Predicts the audio channels that will be in the output stream - /// </summary> + /// Predicts the audio channels that will be in the output stream + /// </summary> public long? TargetSize { get @@ -763,9 +813,13 @@ namespace MediaBrowser.Model.Dlna return TargetVideoStream == null ? (bool?)null : TargetVideoStream.IsInterlaced; } - if (DeInterlace) + var videoCodec = TargetVideoCodec; + if (!string.IsNullOrWhiteSpace(videoCodec)) { - return false; + if (string.Equals(GetOption(videoCodec, "deinterlace"), "true", StringComparison.OrdinalIgnoreCase)) + { + return false; + } } return TargetVideoStream == null ? (bool?)null : TargetVideoStream.IsInterlaced; |
