Add SinglePeriodTimeline constructor to fill missing window information

Issue:#2930

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=160520480
This commit is contained in:
aquilescanta 2017-06-29 06:53:56 -07:00 committed by Oliver Woodman
parent 51af85f263
commit e344e9cbb7
2 changed files with 39 additions and 7 deletions

View file

@ -26,6 +26,8 @@ public final class SinglePeriodTimeline extends Timeline {
private static final Object ID = new Object();
private final long presentationStartTimeMs;
private final long windowStartTimeMs;
private final long periodDurationUs;
private final long windowDurationUs;
private final long windowPositionInPeriodUs;
@ -45,8 +47,8 @@ public final class SinglePeriodTimeline extends Timeline {
}
/**
* Creates a timeline with one period of known duration, and a window of known duration starting
* at a specified position in the period.
* Creates a timeline with one period, and a window of known duration starting at a specified
* position in the period.
*
* @param periodDurationUs The duration of the period in microseconds.
* @param windowDurationUs The duration of the window in microseconds.
@ -60,6 +62,31 @@ public final class SinglePeriodTimeline extends Timeline {
public SinglePeriodTimeline(long periodDurationUs, long windowDurationUs,
long windowPositionInPeriodUs, long windowDefaultStartPositionUs, boolean isSeekable,
boolean isDynamic) {
this(C.TIME_UNSET, C.TIME_UNSET, periodDurationUs, windowDurationUs, windowPositionInPeriodUs,
windowDefaultStartPositionUs, isSeekable, isDynamic);
}
/**
* Creates a timeline with one period, and a window of known duration starting at a specified
* position in the period.
*
* @param presentationStartTimeMs The start time of the presentation in milliseconds since the
* epoch.
* @param windowStartTimeMs The window's start time in milliseconds since the epoch.
* @param periodDurationUs The duration of the period in microseconds.
* @param windowDurationUs The duration of the window in microseconds.
* @param windowPositionInPeriodUs The position of the start of the window in the period, in
* microseconds.
* @param windowDefaultStartPositionUs The default position relative to the start of the window at
* which to begin playback, in microseconds.
* @param isSeekable Whether seeking is supported within the window.
* @param isDynamic Whether the window may change when the timeline is updated.
*/
public SinglePeriodTimeline(long presentationStartTimeMs, long windowStartTimeMs,
long periodDurationUs, long windowDurationUs, long windowPositionInPeriodUs,
long windowDefaultStartPositionUs, boolean isSeekable, boolean isDynamic) {
this.presentationStartTimeMs = presentationStartTimeMs;
this.windowStartTimeMs = windowStartTimeMs;
this.periodDurationUs = periodDurationUs;
this.windowDurationUs = windowDurationUs;
this.windowPositionInPeriodUs = windowPositionInPeriodUs;
@ -86,7 +113,7 @@ public final class SinglePeriodTimeline extends Timeline {
windowDefaultStartPositionUs = C.TIME_UNSET;
}
}
return window.set(id, C.TIME_UNSET, C.TIME_UNSET, isSeekable, isDynamic,
return window.set(id, presentationStartTimeMs, windowStartTimeMs, isSeekable, isDynamic,
windowDefaultStartPositionUs, windowDurationUs, 0, 0, windowPositionInPeriodUs);
}

View file

@ -111,6 +111,9 @@ public final class HlsMediaSource implements MediaSource,
@Override
public void onPrimaryPlaylistRefreshed(HlsMediaPlaylist playlist) {
SinglePeriodTimeline timeline;
long presentationStartTimeMs = playlist.hasProgramDateTime ? 0 : C.TIME_UNSET;
long windowStartTimeMs = playlist.hasProgramDateTime ? C.usToMs(playlist.startTimeUs)
: C.TIME_UNSET;
long windowDefaultStartPositionUs = playlist.startOffsetUs;
if (playlistTracker.isLive()) {
long periodDurationUs = playlist.hasEndTag ? (playlist.startTimeUs + playlist.durationUs)
@ -120,14 +123,16 @@ public final class HlsMediaSource implements MediaSource,
windowDefaultStartPositionUs = segments.isEmpty() ? 0
: segments.get(Math.max(0, segments.size() - 3)).relativeStartTimeUs;
}
timeline = new SinglePeriodTimeline(periodDurationUs, playlist.durationUs,
playlist.startTimeUs, windowDefaultStartPositionUs, true, !playlist.hasEndTag);
timeline = new SinglePeriodTimeline(presentationStartTimeMs, windowStartTimeMs,
periodDurationUs, playlist.durationUs, playlist.startTimeUs, windowDefaultStartPositionUs,
true, !playlist.hasEndTag);
} else /* not live */ {
if (windowDefaultStartPositionUs == C.TIME_UNSET) {
windowDefaultStartPositionUs = 0;
}
timeline = new SinglePeriodTimeline(playlist.startTimeUs + playlist.durationUs,
playlist.durationUs, playlist.startTimeUs, windowDefaultStartPositionUs, true, false);
timeline = new SinglePeriodTimeline(presentationStartTimeMs, windowStartTimeMs,
playlist.startTimeUs + playlist.durationUs, playlist.durationUs, playlist.startTimeUs,
windowDefaultStartPositionUs, true, false);
}
sourceListener.onSourceInfoRefreshed(timeline,
new HlsManifest(playlistTracker.getMasterPlaylist(), playlist));