diff --git a/library/src/main/java/com/google/android/exoplayer2/source/MediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/MediaSource.java
index 4c0686eec15..8f180ad69e0 100644
--- a/library/src/main/java/com/google/android/exoplayer2/source/MediaSource.java
+++ b/library/src/main/java/com/google/android/exoplayer2/source/MediaSource.java
@@ -55,9 +55,9 @@ interface Listener {
/**
* Returns a {@link MediaPeriod} corresponding to the period at the specified index.
*
- * {@link Callback#onPrepared(MediaPeriod)} is called when the new period is prepared. If
- * preparation fails, {@link MediaPeriod#maybeThrowPrepareError()} will throw an
- * {@link IOException} if called on the returned instance.
+ * {@link Callback#onPrepared(MediaPeriod)} is called after this method has returned, when the new
+ * period is prepared. If preparation fails, {@link MediaPeriod#maybeThrowPrepareError()} will
+ * throw an {@link IOException} if called on the returned instance.
*
* @param index The index of the period.
* @param callback A callback to receive updates from the period.
diff --git a/library/src/main/java/com/google/android/exoplayer2/source/MergingMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/MergingMediaSource.java
index 8653a91a6d4..edd9a1f48ce 100644
--- a/library/src/main/java/com/google/android/exoplayer2/source/MergingMediaSource.java
+++ b/library/src/main/java/com/google/android/exoplayer2/source/MergingMediaSource.java
@@ -19,7 +19,6 @@
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.source.MediaPeriod.Callback;
import com.google.android.exoplayer2.upstream.Allocator;
-import com.google.android.exoplayer2.util.Assertions;
import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -125,7 +124,6 @@ public MediaPeriod createPeriod(int index, Callback callback, Allocator allocato
MergingMediaPeriod mergingPeriod = new MergingMediaPeriod(callback, periods);
for (int i = 0; i < periods.length; i++) {
periods[i] = mediaSources[i].createPeriod(index, mergingPeriod, allocator, positionUs);
- Assertions.checkState(periods[i] != null, "Child source must not return null period");
}
return mergingPeriod;
}
diff --git a/library/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java b/library/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java
index 2e6b22e05c7..7981067d830 100644
--- a/library/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java
+++ b/library/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java
@@ -51,6 +51,7 @@
private final int eventSourceId;
private final TrackGroupArray tracks;
private final ArrayList sampleStreams;
+ private final Handler handler;
/* package */ final Loader loader;
/* package */ final Format format;
@@ -60,7 +61,7 @@
public SingleSampleMediaPeriod(Uri uri, DataSource.Factory dataSourceFactory, Format format,
int minLoadableRetryCount, Handler eventHandler, EventListener eventListener,
- int eventSourceId) {
+ int eventSourceId, final Callback callback) {
this.uri = uri;
this.dataSourceFactory = dataSourceFactory;
this.format = format;
@@ -70,12 +71,20 @@ public SingleSampleMediaPeriod(Uri uri, DataSource.Factory dataSourceFactory, Fo
this.eventSourceId = eventSourceId;
tracks = new TrackGroupArray(new TrackGroup(format));
sampleStreams = new ArrayList<>();
+ handler = new Handler();
loader = new Loader("Loader:SingleSampleMediaPeriod");
sampleData = new byte[INITIAL_SAMPLE_SIZE];
+ handler.post(new Runnable() {
+ @Override
+ public void run() {
+ callback.onPrepared(SingleSampleMediaPeriod.this);
+ }
+ });
}
public void release() {
loader.release();
+ handler.removeCallbacksAndMessages(null);
}
@Override
diff --git a/library/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java
index c0902f5a846..e1acfb42cdf 100644
--- a/library/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java
+++ b/library/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java
@@ -98,10 +98,8 @@ public void maybeThrowSourceInfoRefreshError() throws IOException {
public MediaPeriod createPeriod(int index, Callback callback, Allocator allocator,
long positionUs) {
Assertions.checkArgument(index == 0);
- MediaPeriod mediaPeriod = new SingleSampleMediaPeriod(uri, dataSourceFactory, format,
- minLoadableRetryCount, eventHandler, eventListener, eventSourceId);
- callback.onPrepared(mediaPeriod);
- return mediaPeriod;
+ return new SingleSampleMediaPeriod(uri, dataSourceFactory, format, minLoadableRetryCount,
+ eventHandler, eventListener, eventSourceId, callback);
}
@Override
diff --git a/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java b/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java
index c5a18b9d2b5..fbc5b8abf1c 100644
--- a/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java
+++ b/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java
@@ -15,6 +15,7 @@
*/
package com.google.android.exoplayer2.source.dash;
+import android.os.Handler;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher;
@@ -51,6 +52,7 @@
private final Callback callback;
private final Allocator allocator;
private final TrackGroupArray trackGroups;
+ private final Handler handler;
private ChunkSampleStream[] sampleStreams;
private CompositeSequenceableLoader sequenceableLoader;
@@ -76,7 +78,13 @@ public DashMediaPeriod(int id, DashManifest manifest, int index,
sequenceableLoader = new CompositeSequenceableLoader(sampleStreams);
period = manifest.getPeriod(index);
trackGroups = buildTrackGroups(period);
- callback.onPrepared(this);
+ handler = new Handler();
+ handler.post(new Runnable() {
+ @Override
+ public void run() {
+ DashMediaPeriod.this.callback.onPrepared(DashMediaPeriod.this);
+ }
+ });
}
public void updateManifest(DashManifest manifest, int index) {
@@ -95,6 +103,7 @@ public void release() {
for (ChunkSampleStream sampleStream : sampleStreams) {
sampleStream.release();
}
+ handler.removeCallbacksAndMessages(null);
}
@Override
diff --git a/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java b/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java
index 9512d60f7d5..7dd1cda6d83 100644
--- a/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java
+++ b/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java
@@ -15,6 +15,7 @@
*/
package com.google.android.exoplayer2.source.smoothstreaming;
+import android.os.Handler;
import android.util.Base64;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox;
@@ -50,6 +51,7 @@
private final Allocator allocator;
private final TrackGroupArray trackGroups;
private final TrackEncryptionBox[] trackEncryptionBoxes;
+ private final Handler handler;
private SsManifest manifest;
private ChunkSampleStream[] sampleStreams;
@@ -74,10 +76,16 @@ public SsMediaPeriod(SsManifest manifest, SsChunkSource.Factory chunkSourceFacto
} else {
trackEncryptionBoxes = null;
}
+ handler = new Handler();
this.manifest = manifest;
sampleStreams = newSampleStreamArray(0);
sequenceableLoader = new CompositeSequenceableLoader(sampleStreams);
- callback.onPrepared(this);
+ handler.post(new Runnable() {
+ @Override
+ public void run() {
+ SsMediaPeriod.this.callback.onPrepared(SsMediaPeriod.this);
+ }
+ });
}
public void updateManifest(SsManifest manifest) {
@@ -92,6 +100,7 @@ public void release() {
for (ChunkSampleStream sampleStream : sampleStreams) {
sampleStream.release();
}
+ handler.removeCallbacksAndMessages(null);
}
@Override