diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsMediaSource.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsMediaSource.java index 0055fbca32..8e8c5aca19 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsMediaSource.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsMediaSource.java @@ -159,12 +159,12 @@ public final class ImaAdsMediaSource implements MediaSource { } @Override - public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { + public MediaPeriod createPeriod(int index, Allocator allocator) { if (timeline.isPeriodAd(index)) { int adBreakIndex = timeline.getAdBreakIndex(index); int adIndexInAdBreak = timeline.getAdIndexInAdBreak(index); if (adIndexInAdBreak >= adBreakMediaSources[adBreakIndex].length) { - DeferredMediaPeriod deferredPeriod = new DeferredMediaPeriod(0, allocator, positionUs); + DeferredMediaPeriod deferredPeriod = new DeferredMediaPeriod(0, allocator); if (adIndexInAdBreak >= adBreakDeferredMediaPeriods[adBreakIndex].length) { adBreakDeferredMediaPeriods[adBreakIndex] = Arrays.copyOf( adBreakDeferredMediaPeriods[adBreakIndex], adIndexInAdBreak + 1); @@ -174,15 +174,13 @@ public final class ImaAdsMediaSource implements MediaSource { } MediaSource adBreakMediaSource = adBreakMediaSources[adBreakIndex][adIndexInAdBreak]; - MediaPeriod adBreakMediaPeriod = adBreakMediaSource.createPeriod(0, allocator, positionUs); + MediaPeriod adBreakMediaPeriod = adBreakMediaSource.createPeriod(0, allocator); mediaSourceByMediaPeriod.put(adBreakMediaPeriod, adBreakMediaSource); return adBreakMediaPeriod; } else { long startUs = timeline.getContentStartTimeUs(index); long endUs = timeline.getContentEndTimeUs(index); - long contentStartUs = startUs + positionUs; - MediaPeriod contentMediaPeriod = contentMediaSource.createPeriod(0, allocator, - contentStartUs); + MediaPeriod contentMediaPeriod = contentMediaSource.createPeriod(0, allocator); ClippingMediaPeriod clippingPeriod = new ClippingMediaPeriod(contentMediaPeriod); clippingPeriod.setClipping(startUs, endUs == C.TIME_UNSET ? C.TIME_END_OF_SOURCE : endUs); mediaSourceByMediaPeriod.put(contentMediaPeriod, contentMediaSource); @@ -436,29 +434,29 @@ public final class ImaAdsMediaSource implements MediaSource { private final int index; private final Allocator allocator; - private final long positionUs; public MediaPeriod mediaPeriod; private MediaPeriod.Callback callback; + private long positionUs; - public DeferredMediaPeriod(int index, Allocator allocator, long positionUs) { + public DeferredMediaPeriod(int index, Allocator allocator) { this.index = index; this.allocator = allocator; - this.positionUs = positionUs; } public void setMediaSource(MediaSource mediaSource) { - mediaPeriod = mediaSource.createPeriod(index, allocator, positionUs); + mediaPeriod = mediaSource.createPeriod(index, allocator); if (callback != null) { - mediaPeriod.prepare(this); + mediaPeriod.prepare(this, positionUs); } } @Override - public void prepare(Callback callback) { + public void prepare(Callback callback, long positionUs) { this.callback = callback; + this.positionUs = positionUs; if (mediaPeriod != null) { - mediaPeriod.prepare(this); + mediaPeriod.prepare(this, positionUs); } } diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/ExoPlayerTest.java index 2d4ff98947..f8217ebf11 100644 --- a/library/core/src/androidTest/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/androidTest/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -535,11 +535,10 @@ public final class ExoPlayerTest extends TestCase { } @Override - public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { + public MediaPeriod createPeriod(int index, Allocator allocator) { Assertions.checkIndex(index, 0, timeline.getPeriodCount()); assertTrue(preparedSource); assertFalse(releasedSource); - assertEquals(0, positionUs); FakeMediaPeriod mediaPeriod = new FakeMediaPeriod(trackGroupArray); activeMediaPeriods.add(mediaPeriod); return mediaPeriod; @@ -583,8 +582,9 @@ public final class ExoPlayerTest extends TestCase { } @Override - public void prepare(Callback callback) { + public void prepare(Callback callback, long positionUs) { assertFalse(preparedPeriod); + assertEquals(0, positionUs); preparedPeriod = true; callback.onPrepared(this); } diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/TimelineTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/TimelineTest.java index fc3ccacbf2..807297910d 100644 --- a/library/core/src/androidTest/java/com/google/android/exoplayer2/TimelineTest.java +++ b/library/core/src/androidTest/java/com/google/android/exoplayer2/TimelineTest.java @@ -87,7 +87,7 @@ public class TimelineTest extends TestCase { } @Override - public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { + public MediaPeriod createPeriod(int index, Allocator allocator) { return null; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index 0f0b18c7b4..be0e6a432e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -1352,7 +1352,7 @@ import java.io.IOException; loadingPeriodHolder.next = newPeriodHolder; } loadingPeriodHolder = newPeriodHolder; - loadingPeriodHolder.mediaPeriod.prepare(this); + loadingPeriodHolder.mediaPeriod.prepare(this, newLoadingPeriodStartPositionUs); setIsLoading(true); } @@ -1528,8 +1528,7 @@ import java.io.IOException; this.startPositionUs = startPositionUs; sampleStreams = new SampleStream[renderers.length]; mayRetainStreamFlags = new boolean[renderers.length]; - mediaPeriod = mediaSource.createPeriod(periodIndex, loadControl.getAllocator(), - startPositionUs); + mediaPeriod = mediaSource.createPeriod(periodIndex, loadControl.getAllocator()); } public long toRendererTime(long periodTimeUs) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaPeriod.java index e14930c7b8..a7690d8d74 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaPeriod.java @@ -68,9 +68,9 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb } @Override - public void prepare(MediaPeriod.Callback callback) { + public void prepare(MediaPeriod.Callback callback, long positionUs) { this.callback = callback; - mediaPeriod.prepare(this); + mediaPeriod.prepare(this, startUs + positionUs); } @Override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java index c61dea9553..c1ae082203 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java @@ -69,9 +69,9 @@ public final class ClippingMediaSource implements MediaSource, MediaSource.Liste } @Override - public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { - ClippingMediaPeriod mediaPeriod = new ClippingMediaPeriod( - mediaSource.createPeriod(index, allocator, startUs + positionUs)); + public MediaPeriod createPeriod(int index, Allocator allocator) { + ClippingMediaPeriod mediaPeriod = + new ClippingMediaPeriod(mediaSource.createPeriod(index, allocator)); mediaPeriods.add(mediaPeriod); mediaPeriod.setClipping(clippingTimeline.startUs, clippingTimeline.endUs); return mediaPeriod; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java index 2299e757d7..6263800e05 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java @@ -91,11 +91,11 @@ public final class ConcatenatingMediaSource implements MediaSource { } @Override - public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { + public MediaPeriod createPeriod(int index, Allocator allocator) { int sourceIndex = timeline.getChildIndexForPeriod(index); int periodIndexInSource = index - timeline.getFirstPeriodIndexInChild(sourceIndex); - MediaPeriod mediaPeriod = mediaSources[sourceIndex].createPeriod(periodIndexInSource, allocator, - positionUs); + MediaPeriod mediaPeriod = + mediaSources[sourceIndex].createPeriod(periodIndexInSource, allocator); sourceIndexByMediaPeriod.put(mediaPeriod, sourceIndex); return mediaPeriod; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java index 7a6424635f..5c86ead25c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java @@ -159,7 +159,7 @@ import java.io.IOException; } @Override - public void prepare(Callback callback) { + public void prepare(Callback callback, long positionUs) { this.callback = callback; loadCondition.open(); startLoading(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java index c560616aae..618f579a94 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java @@ -156,7 +156,7 @@ public final class ExtractorMediaSource implements MediaSource, MediaSource.List } @Override - public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { + public MediaPeriod createPeriod(int index, Allocator allocator) { Assertions.checkArgument(index == 0); return new ExtractorMediaPeriod(uri, dataSourceFactory.createDataSource(), extractorsFactory.createExtractors(), minLoadableRetryCount, eventHandler, eventListener, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/LoopingMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/LoopingMediaSource.java index a97f7ecd95..240a2b9350 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/LoopingMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/LoopingMediaSource.java @@ -76,10 +76,10 @@ public final class LoopingMediaSource implements MediaSource { } @Override - public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { + public MediaPeriod createPeriod(int index, Allocator allocator) { return loopCount != Integer.MAX_VALUE - ? childSource.createPeriod(index % childPeriodCount, allocator, positionUs) - : childSource.createPeriod(index, allocator, positionUs); + ? childSource.createPeriod(index % childPeriodCount, allocator) + : childSource.createPeriod(index, allocator); } @Override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java index 3b06542855..90d72dd907 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java @@ -55,8 +55,10 @@ public interface MediaPeriod extends SequenceableLoader { * * @param callback Callback to receive updates from this period, including being notified when * preparation completes. + * @param positionUs The position in microseconds relative to the start of the period at which to + * start loading data. */ - void prepare(Callback callback); + void prepare(Callback callback, long positionUs); /** * Throws an error that's preventing the period from becoming prepared. Does nothing if no such @@ -162,9 +164,9 @@ public interface MediaPeriod extends SequenceableLoader { * This method may be called both during and after the period has been prepared. *
* A period may call {@link Callback#onContinueLoadingRequested(SequenceableLoader)} on the
- * {@link Callback} passed to {@link #prepare(Callback)} to request that this method be called
- * when the period is permitted to continue loading data. A period may do this both during and
- * after preparation.
+ * {@link Callback} passed to {@link #prepare(Callback, long)} to request that this method be
+ * called when the period is permitted to continue loading data. A period may do this both during
+ * and after preparation.
*
* @param positionUs The current playback position.
* @return True if progress was made, meaning that {@link #getNextLoadPositionUs()} will return
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java
index f013e790f7..08c238fca7 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java
@@ -64,10 +64,9 @@ public interface MediaSource {
*
* @param index The index of the period.
* @param allocator An {@link Allocator} from which to obtain media buffer allocations.
- * @param positionUs The player's current playback position.
* @return A new {@link MediaPeriod}.
*/
- MediaPeriod createPeriod(int index, Allocator allocator, long positionUs);
+ MediaPeriod createPeriod(int index, Allocator allocator);
/**
* Releases the period.
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java
index 077b5576c1..cfb75b1b87 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java
@@ -44,11 +44,11 @@ import java.util.IdentityHashMap;
}
@Override
- public void prepare(Callback callback) {
+ public void prepare(Callback callback, long positionUs) {
this.callback = callback;
pendingChildPrepareCount = periods.length;
for (MediaPeriod period : periods) {
- period.prepare(this);
+ period.prepare(this, positionUs);
}
}
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaSource.java
index 6f37165916..421a05adc2 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaSource.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaSource.java
@@ -116,10 +116,10 @@ public final class MergingMediaSource implements MediaSource {
}
@Override
- public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) {
+ public MediaPeriod createPeriod(int index, Allocator allocator) {
MediaPeriod[] periods = new MediaPeriod[mediaSources.length];
for (int i = 0; i < periods.length; i++) {
- periods[i] = mediaSources[i].createPeriod(index, allocator, positionUs);
+ periods[i] = mediaSources[i].createPeriod(index, allocator);
}
return new MergingMediaPeriod(periods);
}
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java
index 8e38588e89..3435c01eeb 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java
@@ -79,7 +79,7 @@ import java.util.Arrays;
}
@Override
- public void prepare(Callback callback) {
+ public void prepare(Callback callback, long positionUs) {
callback.onPrepared(this);
}
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java
index f6ee84a6f4..7544176c54 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java
@@ -95,7 +95,7 @@ public final class SingleSampleMediaSource implements MediaSource {
}
@Override
- public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) {
+ public MediaPeriod createPeriod(int index, Allocator allocator) {
Assertions.checkArgument(index == 0);
return new SingleSampleMediaPeriod(uri, dataSourceFactory, format, minLoadableRetryCount,
eventHandler, eventListener, eventSourceId);
diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java
index 6b9668e4b9..905c82364a 100644
--- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java
+++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java
@@ -106,7 +106,7 @@ import java.util.List;
}
@Override
- public void prepare(Callback callback) {
+ public void prepare(Callback callback, long positionUs) {
this.callback = callback;
callback.onPrepared(this);
}
diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java
index 111729d361..82503673e5 100644
--- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java
+++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java
@@ -281,7 +281,7 @@ public final class DashMediaSource implements MediaSource {
}
@Override
- public MediaPeriod createPeriod(int periodIndex, Allocator allocator, long positionUs) {
+ public MediaPeriod createPeriod(int periodIndex, Allocator allocator) {
EventDispatcher periodEventDispatcher = eventDispatcher.copyWithMediaTimeOffsetMs(
manifest.getPeriod(periodIndex).startMs);
DashMediaPeriod mediaPeriod = new DashMediaPeriod(firstPeriodId + periodIndex, manifest,
diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java
index 3a833f5468..25e48d8cce 100644
--- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java
+++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java
@@ -51,7 +51,6 @@ public final class HlsMediaPeriod implements MediaPeriod, HlsSampleStreamWrapper
private final IdentityHashMap