diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-08-05 19:59:24 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-08-05 19:59:24 -0400 |
| commit | 3ba6364f259ea43979a88b2a83d64292119057dc (patch) | |
| tree | 5663fb9c54387e92a09d219488ad1af9276232aa /MediaBrowser.Model/Dlna | |
| parent | 7e25c857a551ce06025b3b85996aef7ed3c6571e (diff) | |
fixes #887 - Support ttml subtitle output
Diffstat (limited to 'MediaBrowser.Model/Dlna')
| -rw-r--r-- | MediaBrowser.Model/Dlna/StreamBuilder.cs | 48 | ||||
| -rw-r--r-- | MediaBrowser.Model/Dlna/StreamInfo.cs | 43 | ||||
| -rw-r--r-- | MediaBrowser.Model/Dlna/SubtitleProfile.cs | 9 |
3 files changed, 54 insertions, 46 deletions
diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index 6e929564e4..22e817de15 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -2,6 +2,7 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Extensions; using MediaBrowser.Model.MediaInfo; +using MediaBrowser.Model.Session; using System; using System.Collections.Generic; @@ -9,7 +10,7 @@ namespace MediaBrowser.Model.Dlna { public class StreamBuilder { - private string[] _serverTextSubtitleOutputs = new string[] { "srt", "vtt" }; + private readonly string[] _serverTextSubtitleOutputs = { "srt", "vtt", "ttml" }; public StreamInfo BuildAudioItem(AudioOptions options) { @@ -158,7 +159,7 @@ namespace MediaBrowser.Model.Dlna if (all) { - playlistItem.IsDirectStream = true; + playlistItem.PlayMethod = PlayMethod.DirectStream; playlistItem.Container = item.Container; return playlistItem; @@ -179,7 +180,7 @@ namespace MediaBrowser.Model.Dlna if (transcodingProfile != null) { - playlistItem.IsDirectStream = false; + playlistItem.PlayMethod = PlayMethod.Transcode; playlistItem.TranscodeSeekInfo = transcodingProfile.TranscodeSeekInfo; playlistItem.EstimateContentLength = transcodingProfile.EstimateContentLength; playlistItem.Container = transcodingProfile.Container; @@ -252,12 +253,12 @@ namespace MediaBrowser.Model.Dlna if (directPlay != null) { - playlistItem.IsDirectStream = true; + playlistItem.PlayMethod = PlayMethod.DirectStream; playlistItem.Container = item.Container; if (subtitleStream != null) { - playlistItem.SubtitleDeliveryMethod = GetDirectStreamSubtitleDeliveryMethod(subtitleStream, options); + playlistItem.SubtitleDeliveryMethod = GetSubtitleDeliveryMethod(subtitleStream, options); } return playlistItem; @@ -279,10 +280,10 @@ namespace MediaBrowser.Model.Dlna { if (subtitleStream != null) { - playlistItem.SubtitleDeliveryMethod = GetTranscodedSubtitleDeliveryMethod(subtitleStream, options); + playlistItem.SubtitleDeliveryMethod = GetSubtitleDeliveryMethod(subtitleStream, options); } - playlistItem.IsDirectStream = false; + playlistItem.PlayMethod = PlayMethod.Transcode; playlistItem.Container = transcodingProfile.Container; playlistItem.EstimateContentLength = transcodingProfile.EstimateContentLength; playlistItem.TranscodeSeekInfo = transcodingProfile.TranscodeSeekInfo; @@ -499,9 +500,9 @@ namespace MediaBrowser.Model.Dlna return false; } - SubtitleDeliveryMethod subtitleMethod = GetDirectStreamSubtitleDeliveryMethod(subtitleStream, options); + SubtitleDeliveryMethod subtitleMethod = GetSubtitleDeliveryMethod(subtitleStream, options); - if (subtitleMethod != SubtitleDeliveryMethod.External && subtitleMethod != SubtitleDeliveryMethod.Direct) + if (subtitleMethod != SubtitleDeliveryMethod.External && subtitleMethod != SubtitleDeliveryMethod.Embed) { return false; } @@ -510,34 +511,7 @@ namespace MediaBrowser.Model.Dlna return IsAudioEligibleForDirectPlay(item, maxBitrate); } - private SubtitleDeliveryMethod GetDirectStreamSubtitleDeliveryMethod(MediaStream subtitleStream, - VideoOptions options) - { - if (subtitleStream.IsTextSubtitleStream) - { - string subtitleFormat = NormalizeSubtitleFormat(subtitleStream.Codec); - - bool supportsDirect = ContainsSubtitleFormat(options.Profile.SoftSubtitleProfiles, new[] { subtitleFormat }); - - if (supportsDirect) - { - return SubtitleDeliveryMethod.Direct; - } - - // See if the device can retrieve the subtitles externally - bool supportsSubsExternally = options.Context == EncodingContext.Streaming && - ContainsSubtitleFormat(options.Profile.ExternalSubtitleProfiles, _serverTextSubtitleOutputs); - - if (supportsSubsExternally) - { - return SubtitleDeliveryMethod.External; - } - } - - return SubtitleDeliveryMethod.Encode; - } - - private SubtitleDeliveryMethod GetTranscodedSubtitleDeliveryMethod(MediaStream subtitleStream, + private SubtitleDeliveryMethod GetSubtitleDeliveryMethod(MediaStream subtitleStream, VideoOptions options) { if (subtitleStream.IsTextSubtitleStream) diff --git a/MediaBrowser.Model/Dlna/StreamInfo.cs b/MediaBrowser.Model/Dlna/StreamInfo.cs index 8bf9f2a04e..4f02d64508 100644 --- a/MediaBrowser.Model/Dlna/StreamInfo.cs +++ b/MediaBrowser.Model/Dlna/StreamInfo.cs @@ -3,6 +3,7 @@ using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Extensions; using MediaBrowser.Model.MediaInfo; +using MediaBrowser.Model.Session; using System; using System.Collections.Generic; @@ -15,7 +16,7 @@ namespace MediaBrowser.Model.Dlna { public string ItemId { get; set; } - public bool IsDirectStream { get; set; } + public PlayMethod PlayMethod { get; set; } public DlnaProfileType MediaType { get; set; } @@ -59,6 +60,7 @@ namespace MediaBrowser.Model.Dlna public MediaSourceInfo MediaSource { get; set; } public SubtitleDeliveryMethod SubtitleDeliveryMethod { get; set; } + public string SubtitleFormat { get; set; } public string MediaSourceId { @@ -68,6 +70,11 @@ namespace MediaBrowser.Model.Dlna } } + public bool IsDirectStream + { + get { return PlayMethod == PlayMethod.DirectStream; } + } + public string ToUrl(string baseUrl) { return ToDlnaUrl(baseUrl); @@ -124,6 +131,32 @@ namespace MediaBrowser.Model.Dlna return string.Format("Params={0}", string.Join(";", list.ToArray())); } + public string ToSubtitleUrl(string baseUrl) + { + if (SubtitleDeliveryMethod != SubtitleDeliveryMethod.External) + { + return null; + } + + if (!SubtitleStreamIndex.HasValue) + { + return null; + } + + // HLS will preserve timestamps so we can just grab the full subtitle stream + long startPositionTicks = StringHelper.EqualsIgnoreCase(Protocol, "hls") + ? 0 + : StartPositionTicks; + + return string.Format("{0}/Videos/{1}/{2}/Subtitles/{3}/{4}/Stream.{5}", + baseUrl, + ItemId, + MediaSourceId, + StringHelper.ToStringCultureInvariant(SubtitleStreamIndex.Value), + StringHelper.ToStringCultureInvariant(startPositionTicks), + SubtitleFormat); + } + /// <summary> /// Returns the audio stream that will be used /// </summary> @@ -437,16 +470,12 @@ namespace MediaBrowser.Model.Dlna /// </summary> Encode = 0, /// <summary> - /// Internal format is supported natively - /// </summary> - Direct = 1, - /// <summary> /// The embed /// </summary> - Embed = 2, + Embed = 1, /// <summary> /// The external /// </summary> - External = 3 + External = 2 } } diff --git a/MediaBrowser.Model/Dlna/SubtitleProfile.cs b/MediaBrowser.Model/Dlna/SubtitleProfile.cs index ec38d96aeb..7aa5e17713 100644 --- a/MediaBrowser.Model/Dlna/SubtitleProfile.cs +++ b/MediaBrowser.Model/Dlna/SubtitleProfile.cs @@ -1,8 +1,13 @@ - +using System.Xml.Serialization; + namespace MediaBrowser.Model.Dlna { public class SubtitleProfile { + [XmlAttribute("format")] public string Format { get; set; } + + [XmlAttribute("protocol")] + public string Protocol { get; set; } } -} +}
\ No newline at end of file |
