Allow specifying the default live presentation delay instead of using hardcoded constant

This commit is contained in:
Nicola Verbeeck 2018-07-19 10:58:58 +02:00
parent a076924caa
commit fbef465ca8

View File

@ -79,6 +79,7 @@ public final class DashMediaSource extends BaseMediaSource {
private CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory; private CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory;
private int minLoadableRetryCount; private int minLoadableRetryCount;
private long livePresentationDelayMs; private long livePresentationDelayMs;
private long defaultLivePresentationDelayMs;
private boolean isCreateCalled; private boolean isCreateCalled;
private @Nullable Object tag; private @Nullable Object tag;
@ -98,6 +99,7 @@ public final class DashMediaSource extends BaseMediaSource {
this.manifestDataSourceFactory = manifestDataSourceFactory; this.manifestDataSourceFactory = manifestDataSourceFactory;
minLoadableRetryCount = DEFAULT_MIN_LOADABLE_RETRY_COUNT; minLoadableRetryCount = DEFAULT_MIN_LOADABLE_RETRY_COUNT;
livePresentationDelayMs = DEFAULT_LIVE_PRESENTATION_DELAY_PREFER_MANIFEST_MS; livePresentationDelayMs = DEFAULT_LIVE_PRESENTATION_DELAY_PREFER_MANIFEST_MS;
defaultLivePresentationDelayMs = DEFAULT_LIVE_PRESENTATION_DELAY_FIXED_MS;
compositeSequenceableLoaderFactory = new DefaultCompositeSequenceableLoaderFactory(); compositeSequenceableLoaderFactory = new DefaultCompositeSequenceableLoaderFactory();
} }
@ -147,6 +149,23 @@ public final class DashMediaSource extends BaseMediaSource {
this.livePresentationDelayMs = livePresentationDelayMs; this.livePresentationDelayMs = livePresentationDelayMs;
return this; return this;
} }
/**
* Sets the duration in milliseconds by which the default start position should precede the end
* of the live window for live playbacks if the value is not present in the manifest. The default value is {@link
* #DEFAULT_LIVE_PRESENTATION_DELAY_FIXED_MS}.
*
* @param defaultLivePresentationDelayMs For live playbacks, the duration in milliseconds by which the
* default start position should precede the end of the live window if the duration is not specifed in the manifest
* or overwritten using @{link setLivePresentationDelayMs).
* @return This factory, for convenience.
* @throws IllegalStateException If one of the {@code create} methods has already been called.
*/
public Factory setDefaultLivePresentationDelayMs(long defaultLivePresentationDelayMs) {
Assertions.checkState(!isCreateCalled);
this.defaultLivePresentationDelayMs = defaultLivePresentationDelayMs;
return this
}
/** /**
* Sets the manifest parser to parse loaded manifest data when loading a manifest URI. * Sets the manifest parser to parse loaded manifest data when loading a manifest URI.
@ -885,7 +904,7 @@ public final class DashMediaSource extends BaseMediaSource {
long presentationDelayForManifestMs = livePresentationDelayMs; long presentationDelayForManifestMs = livePresentationDelayMs;
if (presentationDelayForManifestMs == DEFAULT_LIVE_PRESENTATION_DELAY_PREFER_MANIFEST_MS) { if (presentationDelayForManifestMs == DEFAULT_LIVE_PRESENTATION_DELAY_PREFER_MANIFEST_MS) {
presentationDelayForManifestMs = manifest.suggestedPresentationDelayMs != C.TIME_UNSET presentationDelayForManifestMs = manifest.suggestedPresentationDelayMs != C.TIME_UNSET
? manifest.suggestedPresentationDelayMs : DEFAULT_LIVE_PRESENTATION_DELAY_FIXED_MS; ? manifest.suggestedPresentationDelayMs : defaultLivePresentationDelayMs;
} }
// Snap the default position to the start of the segment containing it. // Snap the default position to the start of the segment containing it.
windowDefaultStartPositionUs = windowDurationUs - C.msToUs(presentationDelayForManifestMs); windowDefaultStartPositionUs = windowDurationUs - C.msToUs(presentationDelayForManifestMs);