mirror of
https://github.com/samsonjs/media.git
synced 2026-04-02 10:45:51 +00:00
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:
parent
51af85f263
commit
e344e9cbb7
2 changed files with 39 additions and 7 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
Loading…
Reference in a new issue