aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2014-08-05 19:59:24 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2014-08-05 19:59:24 -0400
commit3ba6364f259ea43979a88b2a83d64292119057dc (patch)
tree5663fb9c54387e92a09d219488ad1af9276232aa /MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs
parent7e25c857a551ce06025b3b85996aef7ed3c6571e (diff)
fixes #887 - Support ttml subtitle output
Diffstat (limited to 'MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs')
-rw-r--r--MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs38
1 files changed, 28 insertions, 10 deletions
diff --git a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs
index ab9cd546a..82e331dd8 100644
--- a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs
+++ b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs
@@ -48,6 +48,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
string inputFormat,
string outputFormat,
long startTimeTicks,
+ long? endTimeTicks,
CancellationToken cancellationToken)
{
var ms = new MemoryStream();
@@ -56,6 +57,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
{
// Return the original without any conversions, if possible
if (startTimeTicks == 0 &&
+ !endTimeTicks.HasValue &&
string.Equals(inputFormat, outputFormat, StringComparison.OrdinalIgnoreCase))
{
await stream.CopyToAsync(ms, 81920, cancellationToken).ConfigureAwait(false);
@@ -64,7 +66,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
{
var trackInfo = await GetTrackInfo(stream, inputFormat, cancellationToken).ConfigureAwait(false);
- UpdateStartingPosition(trackInfo, startTimeTicks);
+ FilterEvents(trackInfo, startTimeTicks, endTimeTicks, false);
var writer = GetWriter(outputFormat);
@@ -81,19 +83,30 @@ namespace MediaBrowser.MediaEncoding.Subtitles
return ms;
}
- private void UpdateStartingPosition(SubtitleTrackInfo track, long startPositionTicks)
+ private void FilterEvents(SubtitleTrackInfo track, long startPositionTicks, long? endTimeTicks, bool preserveTimestamps)
{
- if (startPositionTicks == 0) return;
+ // Drop subs that are earlier than what we're looking for
+ track.TrackEvents = track.TrackEvents
+ .SkipWhile(i => (i.StartPositionTicks - startPositionTicks) < 0 || (i.EndPositionTicks - startPositionTicks) < 0)
+ .ToList();
- foreach (var trackEvent in track.TrackEvents)
+ if (endTimeTicks.HasValue)
{
- trackEvent.EndPositionTicks -= startPositionTicks;
- trackEvent.StartPositionTicks -= startPositionTicks;
+ var endTime = endTimeTicks.Value;
+
+ track.TrackEvents = track.TrackEvents
+ .TakeWhile(i => i.StartPositionTicks <= endTime)
+ .ToList();
}
- track.TrackEvents = track.TrackEvents
- .SkipWhile(i => i.StartPositionTicks < 0 || i.EndPositionTicks < 0)
- .ToList();
+ if (!preserveTimestamps)
+ {
+ foreach (var trackEvent in track.TrackEvents)
+ {
+ trackEvent.EndPositionTicks -= startPositionTicks;
+ trackEvent.StartPositionTicks -= startPositionTicks;
+ }
+ }
}
public async Task<Stream> GetSubtitles(string itemId,
@@ -101,6 +114,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
int subtitleStreamIndex,
string outputFormat,
long startTimeTicks,
+ long? endTimeTicks,
CancellationToken cancellationToken)
{
var subtitle = await GetSubtitleStream(itemId, mediaSourceId, subtitleStreamIndex, cancellationToken)
@@ -110,7 +124,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
{
var inputFormat = subtitle.Item2;
- return await ConvertSubtitles(stream, inputFormat, outputFormat, startTimeTicks, cancellationToken).ConfigureAwait(false);
+ return await ConvertSubtitles(stream, inputFormat, outputFormat, startTimeTicks, endTimeTicks, cancellationToken).ConfigureAwait(false);
}
}
@@ -254,6 +268,10 @@ namespace MediaBrowser.MediaEncoding.Subtitles
{
return new VttWriter();
}
+ if (string.Equals(format, SubtitleFormat.TTML, StringComparison.OrdinalIgnoreCase))
+ {
+ return new TtmlWriter();
+ }
throw new ArgumentException("Unsupported format: " + format);
}