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