mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +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 static final Object ID = new Object();
|
||||||
|
|
||||||
|
private final long presentationStartTimeMs;
|
||||||
|
private final long windowStartTimeMs;
|
||||||
private final long periodDurationUs;
|
private final long periodDurationUs;
|
||||||
private final long windowDurationUs;
|
private final long windowDurationUs;
|
||||||
private final long windowPositionInPeriodUs;
|
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
|
* Creates a timeline with one period, and a window of known duration starting at a specified
|
||||||
* at a specified position in the period.
|
* position in the period.
|
||||||
*
|
*
|
||||||
* @param periodDurationUs The duration of the period in microseconds.
|
* @param periodDurationUs The duration of the period in microseconds.
|
||||||
* @param windowDurationUs The duration of the window 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,
|
public SinglePeriodTimeline(long periodDurationUs, long windowDurationUs,
|
||||||
long windowPositionInPeriodUs, long windowDefaultStartPositionUs, boolean isSeekable,
|
long windowPositionInPeriodUs, long windowDefaultStartPositionUs, boolean isSeekable,
|
||||||
boolean isDynamic) {
|
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.periodDurationUs = periodDurationUs;
|
||||||
this.windowDurationUs = windowDurationUs;
|
this.windowDurationUs = windowDurationUs;
|
||||||
this.windowPositionInPeriodUs = windowPositionInPeriodUs;
|
this.windowPositionInPeriodUs = windowPositionInPeriodUs;
|
||||||
|
|
@ -86,7 +113,7 @@ public final class SinglePeriodTimeline extends Timeline {
|
||||||
windowDefaultStartPositionUs = C.TIME_UNSET;
|
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);
|
windowDefaultStartPositionUs, windowDurationUs, 0, 0, windowPositionInPeriodUs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,9 @@ public final class HlsMediaSource implements MediaSource,
|
||||||
@Override
|
@Override
|
||||||
public void onPrimaryPlaylistRefreshed(HlsMediaPlaylist playlist) {
|
public void onPrimaryPlaylistRefreshed(HlsMediaPlaylist playlist) {
|
||||||
SinglePeriodTimeline timeline;
|
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;
|
long windowDefaultStartPositionUs = playlist.startOffsetUs;
|
||||||
if (playlistTracker.isLive()) {
|
if (playlistTracker.isLive()) {
|
||||||
long periodDurationUs = playlist.hasEndTag ? (playlist.startTimeUs + playlist.durationUs)
|
long periodDurationUs = playlist.hasEndTag ? (playlist.startTimeUs + playlist.durationUs)
|
||||||
|
|
@ -120,14 +123,16 @@ public final class HlsMediaSource implements MediaSource,
|
||||||
windowDefaultStartPositionUs = segments.isEmpty() ? 0
|
windowDefaultStartPositionUs = segments.isEmpty() ? 0
|
||||||
: segments.get(Math.max(0, segments.size() - 3)).relativeStartTimeUs;
|
: segments.get(Math.max(0, segments.size() - 3)).relativeStartTimeUs;
|
||||||
}
|
}
|
||||||
timeline = new SinglePeriodTimeline(periodDurationUs, playlist.durationUs,
|
timeline = new SinglePeriodTimeline(presentationStartTimeMs, windowStartTimeMs,
|
||||||
playlist.startTimeUs, windowDefaultStartPositionUs, true, !playlist.hasEndTag);
|
periodDurationUs, playlist.durationUs, playlist.startTimeUs, windowDefaultStartPositionUs,
|
||||||
|
true, !playlist.hasEndTag);
|
||||||
} else /* not live */ {
|
} else /* not live */ {
|
||||||
if (windowDefaultStartPositionUs == C.TIME_UNSET) {
|
if (windowDefaultStartPositionUs == C.TIME_UNSET) {
|
||||||
windowDefaultStartPositionUs = 0;
|
windowDefaultStartPositionUs = 0;
|
||||||
}
|
}
|
||||||
timeline = new SinglePeriodTimeline(playlist.startTimeUs + playlist.durationUs,
|
timeline = new SinglePeriodTimeline(presentationStartTimeMs, windowStartTimeMs,
|
||||||
playlist.durationUs, playlist.startTimeUs, windowDefaultStartPositionUs, true, false);
|
playlist.startTimeUs + playlist.durationUs, playlist.durationUs, playlist.startTimeUs,
|
||||||
|
windowDefaultStartPositionUs, true, false);
|
||||||
}
|
}
|
||||||
sourceListener.onSourceInfoRefreshed(timeline,
|
sourceListener.onSourceInfoRefreshed(timeline,
|
||||||
new HlsManifest(playlistTracker.getMasterPlaylist(), playlist));
|
new HlsManifest(playlistTracker.getMasterPlaylist(), playlist));
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue