From f7e9e9f7a5da3c5fcd0e52d53c9e0daabae8b8ef Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 6 Mar 2016 16:31:56 -0500 Subject: [PATCH] support hls subs --- .../Playback/Hls/DynamicHlsService.cs | 17 ++++++++++++----- MediaBrowser.Model/Dlna/StreamBuilder.cs | 5 +++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index 4a83615b4d..e3f6e15e20 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -529,7 +529,7 @@ namespace MediaBrowser.Api.Playback.Hls "subs" : null; - AppendPlaylist(builder, playlistUrl, totalBitrate, subtitleGroup); + AppendPlaylist(builder, state, playlistUrl, totalBitrate, subtitleGroup); if (EnableAdaptiveBitrateStreaming(state, isLiveStream)) { @@ -540,12 +540,12 @@ namespace MediaBrowser.Api.Playback.Hls var newBitrate = totalBitrate - variation; var variantUrl = ReplaceBitrate(playlistUrl, requestedVideoBitrate, (requestedVideoBitrate - variation)); - AppendPlaylist(builder, variantUrl, newBitrate, subtitleGroup); + AppendPlaylist(builder, state, variantUrl, newBitrate, subtitleGroup); variation *= 2; newBitrate = totalBitrate - variation; variantUrl = ReplaceBitrate(playlistUrl, requestedVideoBitrate, (requestedVideoBitrate - variation)); - AppendPlaylist(builder, variantUrl, newBitrate, subtitleGroup); + AppendPlaylist(builder, state, variantUrl, newBitrate, subtitleGroup); } if (!string.IsNullOrWhiteSpace(subtitleGroup)) @@ -635,9 +635,15 @@ namespace MediaBrowser.Api.Playback.Hls //return state.VideoRequest.VideoBitRate.HasValue; } - private void AppendPlaylist(StringBuilder builder, string url, int bitrate, string subtitleGroup) + private void AppendPlaylist(StringBuilder builder, StreamState state, string url, int bitrate, string subtitleGroup) { - var header = "#EXT-X-STREAM-INF:BANDWIDTH=" + bitrate.ToString(UsCulture); + var header = "#EXT-X-STREAM-INF:BANDWIDTH=" + bitrate.ToString(UsCulture) + ",AVERAGE-BANDWIDTH=" + bitrate.ToString(UsCulture); + + // tvos wants resolution, codecs, framerate + //if (state.TargetFramerate.HasValue) + //{ + // header += string.Format(",FRAME-RATE=\"{0}\"", state.TargetFramerate.Value.ToString(CultureInfo.InvariantCulture)); + //} if (!string.IsNullOrWhiteSpace(subtitleGroup)) { @@ -694,6 +700,7 @@ namespace MediaBrowser.Api.Playback.Hls var builder = new StringBuilder(); builder.AppendLine("#EXTM3U"); + builder.AppendLine("#EXT-X-PLAYLIST-TYPE:VOD"); builder.AppendLine("#EXT-X-VERSION:3"); builder.AppendLine("#EXT-X-TARGETDURATION:" + Math.Ceiling((segmentLengths.Length > 0 ? segmentLengths.Max() : state.SegmentLength)).ToString(UsCulture)); builder.AppendLine("#EXT-X-MEDIA-SEQUENCE:0"); diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index d4ca379c03..7d7360759c 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -761,7 +761,7 @@ namespace MediaBrowser.Model.Dlna // Look for an external profile that matches the stream type (text/graphical) foreach (SubtitleProfile profile in subtitleProfiles) { - if (profile.Method != SubtitleDeliveryMethod.External) + if (profile.Method != SubtitleDeliveryMethod.External && profile.Method != SubtitleDeliveryMethod.Hls) { continue; } @@ -771,7 +771,8 @@ namespace MediaBrowser.Model.Dlna continue; } - if (subtitleStream.IsTextSubtitleStream == MediaStream.IsTextFormat(profile.Format)) + if ((profile.Method == SubtitleDeliveryMethod.External && subtitleStream.IsTextSubtitleStream == MediaStream.IsTextFormat(profile.Format)) || + (profile.Method == SubtitleDeliveryMethod.Hls && subtitleStream.IsTextSubtitleStream)) { bool requiresConversion = !StringHelper.EqualsIgnoreCase(subtitleStream.Codec, profile.Format);