From 825ec70d319b9aba7dbe488f8139eb5392859cc9 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Wed, 28 Sep 2016 00:37:42 -0700 Subject: [PATCH] Move preparation from MediaPeriod constructors to prepare(). ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=134504088 --- .../exoplayer2/ExoPlayerImplInternal.java | 3 ++- .../source/ConcatenatingMediaSource.java | 8 +++---- .../source/ExtractorMediaPeriod.java | 15 +++++++------ .../source/ExtractorMediaSource.java | 6 ++---- .../exoplayer2/source/LoopingMediaSource.java | 6 ++---- .../exoplayer2/source/MediaPeriod.java | 11 ++++++++++ .../exoplayer2/source/MediaSource.java | 8 +------ .../exoplayer2/source/MergingMediaPeriod.java | 13 +++++++++--- .../exoplayer2/source/MergingMediaSource.java | 10 +++------ .../source/SingleSampleMediaPeriod.java | 16 ++++++-------- .../source/SingleSampleMediaSource.java | 6 ++---- .../source/dash/DashMediaPeriod.java | 21 +++++++------------ .../source/dash/DashMediaSource.java | 6 ++---- .../exoplayer2/source/hls/HlsMediaPeriod.java | 21 ++++++++++++------- .../exoplayer2/source/hls/HlsMediaSource.java | 6 ++---- .../source/smoothstreaming/SsMediaPeriod.java | 21 +++++++------------ .../source/smoothstreaming/SsMediaSource.java | 6 ++---- 17 files changed, 86 insertions(+), 97 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index ed19afa29c..84ed37af8b 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -952,8 +952,9 @@ import java.io.IOException; periodStartPositionUs = defaultPosition.second; } Object newPeriodUid = timeline.getPeriod(newLoadingPeriodIndex, period, true).uid; - MediaPeriod newMediaPeriod = mediaSource.createPeriod(newLoadingPeriodIndex, this, + MediaPeriod newMediaPeriod = mediaSource.createPeriod(newLoadingPeriodIndex, loadControl.getAllocator(), periodStartPositionUs); + newMediaPeriod.prepare(this); MediaPeriodHolder newPeriodHolder = new MediaPeriodHolder<>(renderers, rendererCapabilities, trackSelector, mediaSource, newMediaPeriod, newPeriodUid, periodStartPositionUs); diff --git a/library/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java index 90af3936a4..3b743c5fda 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java @@ -18,7 +18,6 @@ package com.google.android.exoplayer2.source; import android.util.Pair; import com.google.android.exoplayer2.C; 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.Util; import java.io.IOException; @@ -79,12 +78,11 @@ public final class ConcatenatingMediaSource implements MediaSource { } @Override - public MediaPeriod createPeriod(int index, Callback callback, Allocator allocator, - long positionUs) { + public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { int sourceIndex = timeline.getSourceIndexForPeriod(index); int periodIndexInSource = index - timeline.getFirstPeriodIndexInSource(sourceIndex); - MediaPeriod mediaPeriod = mediaSources[sourceIndex].createPeriod(periodIndexInSource, callback, - allocator, positionUs); + MediaPeriod mediaPeriod = mediaSources[sourceIndex].createPeriod(periodIndexInSource, allocator, + positionUs); sourceIndexByMediaPeriod.put(mediaPeriod, sourceIndex); return mediaPeriod; } diff --git a/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java b/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java index 8512167adb..e1945c1a79 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java @@ -61,7 +61,6 @@ import java.util.Arrays; private final Handler eventHandler; private final ExtractorMediaSource.EventListener eventListener; private final MediaSource.Listener sourceListener; - private final Callback callback; private final Allocator allocator; private final Loader loader; private final ExtractorHolder extractorHolder; @@ -70,6 +69,7 @@ import java.util.Arrays; private final Runnable onContinueLoadingRequestedRunnable; private final Handler handler; + private Callback callback; private SeekMap seekMap; private boolean tracksBuilt; private boolean prepared; @@ -98,20 +98,18 @@ import java.util.Arrays; * @param eventHandler A handler for events. May be null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required. * @param sourceListener A listener to notify when the timeline has been loaded. - * @param callback A callback to receive updates from the period. * @param allocator An {@link Allocator} from which to obtain media buffer allocations. */ public ExtractorMediaPeriod(Uri uri, DataSource dataSource, Extractor[] extractors, int minLoadableRetryCount, Handler eventHandler, ExtractorMediaSource.EventListener eventListener, MediaSource.Listener sourceListener, - final Callback callback, Allocator allocator) { + Allocator allocator) { this.uri = uri; this.dataSource = dataSource; this.minLoadableRetryCount = minLoadableRetryCount; this.eventHandler = eventHandler; this.eventListener = eventListener; this.sourceListener = sourceListener; - this.callback = callback; this.allocator = allocator; loader = new Loader("Loader:ExtractorMediaPeriod"); extractorHolder = new ExtractorHolder(extractors, this); @@ -135,8 +133,6 @@ import java.util.Arrays; pendingResetPositionUs = C.TIME_UNSET; sampleQueues = new DefaultTrackOutput[0]; length = C.LENGTH_UNSET; - loadCondition.open(); - startLoading(); } public void release() { @@ -154,6 +150,13 @@ import java.util.Arrays; released = true; } + @Override + public void prepare(Callback callback) { + this.callback = callback; + loadCondition.open(); + startLoading(); + } + @Override public void maybeThrowPrepareError() throws IOException { maybeThrowError(); diff --git a/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java index 936358352e..bf795241bc 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java @@ -23,7 +23,6 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorsFactory; -import com.google.android.exoplayer2.source.MediaPeriod.Callback; import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.util.Assertions; @@ -148,12 +147,11 @@ public final class ExtractorMediaSource implements MediaSource, MediaSource.List } @Override - public MediaPeriod createPeriod(int index, Callback callback, Allocator allocator, - long positionUs) { + public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { Assertions.checkArgument(index == 0); return new ExtractorMediaPeriod(uri, dataSourceFactory.createDataSource(), extractorsFactory.createExtractors(), minLoadableRetryCount, eventHandler, eventListener, - this, callback, allocator); + this, allocator); } @Override diff --git a/library/src/main/java/com/google/android/exoplayer2/source/LoopingMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/LoopingMediaSource.java index e41f5cdc1e..21455ed89d 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/LoopingMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/LoopingMediaSource.java @@ -19,7 +19,6 @@ import android.util.Log; import android.util.Pair; import com.google.android.exoplayer2.C; 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; @@ -76,9 +75,8 @@ public final class LoopingMediaSource implements MediaSource { } @Override - public MediaPeriod createPeriod(int index, Callback callback, Allocator allocator, - long positionUs) { - return childSource.createPeriod(index % childPeriodCount, callback, allocator, positionUs); + public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { + return childSource.createPeriod(index % childPeriodCount, allocator, positionUs); } @Override diff --git a/library/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java b/library/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java index b274b0400d..a3c1c88df4 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java @@ -42,6 +42,17 @@ public interface MediaPeriod extends SequenceableLoader { } + /** + * Prepares this media period asynchronously. + *

+ * {@code callback.onPrepared} is called when preparation completes. If preparation fails, + * {@link #maybeThrowPrepareError()} will throw an {@link IOException}. + * + * @param callback Callback to receive updates from this period, including being notified when + * preparation completes. + */ + void prepare(Callback callback); + /** * Throws an error that's preventing the period from becoming prepared. Does nothing if no such * error exists. 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 8f180ad69e..709a92cbf5 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 @@ -16,7 +16,6 @@ package com.google.android.exoplayer2.source; import com.google.android.exoplayer2.Timeline; -import com.google.android.exoplayer2.source.MediaPeriod.Callback; import com.google.android.exoplayer2.upstream.Allocator; import java.io.IOException; @@ -54,18 +53,13 @@ public interface MediaSource { /** * Returns a {@link MediaPeriod} corresponding to the period at the specified index. - *

- * {@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. * @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, Callback callback, Allocator allocator, long positionUs); + MediaPeriod createPeriod(int index, Allocator allocator, long positionUs); /** * Releases the period. diff --git a/library/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java b/library/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java index 4df6cdfebf..227dc29366 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java @@ -28,20 +28,27 @@ import java.util.IdentityHashMap; public final MediaPeriod[] periods; - private final Callback callback; private final IdentityHashMap streamPeriodIndices; + private Callback callback; private int pendingChildPrepareCount; private TrackGroupArray trackGroups; private MediaPeriod[] enabledPeriods; private SequenceableLoader sequenceableLoader; - public MergingMediaPeriod(Callback callback, MediaPeriod... periods) { + public MergingMediaPeriod(MediaPeriod... periods) { this.periods = periods; - this.callback = callback; streamPeriodIndices = new IdentityHashMap<>(); + } + + @Override + public void prepare(Callback callback) { + this.callback = callback; pendingChildPrepareCount = periods.length; + for (MediaPeriod period : periods) { + period.prepare(this); + } } @Override 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 edd9a1f48c..7d5f78c1cd 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 @@ -17,7 +17,6 @@ package com.google.android.exoplayer2.source; import android.support.annotation.IntDef; import com.google.android.exoplayer2.Timeline; -import com.google.android.exoplayer2.source.MediaPeriod.Callback; import com.google.android.exoplayer2.upstream.Allocator; import java.io.IOException; import java.lang.annotation.Retention; @@ -117,15 +116,12 @@ public final class MergingMediaSource implements MediaSource { } @Override - public MediaPeriod createPeriod(int index, Callback callback, Allocator allocator, - long positionUs) { + public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { MediaPeriod[] periods = new MediaPeriod[mediaSources.length]; - // The periods are only referenced after they have all been prepared. - MergingMediaPeriod mergingPeriod = new MergingMediaPeriod(callback, periods); for (int i = 0; i < periods.length; i++) { - periods[i] = mediaSources[i].createPeriod(index, mergingPeriod, allocator, positionUs); + periods[i] = mediaSources[i].createPeriod(index, allocator, positionUs); } - return mergingPeriod; + return new MergingMediaPeriod(periods); } @Override 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 7981067d83..2888f267ce 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,7 +51,6 @@ import java.util.Arrays; private final int eventSourceId; private final TrackGroupArray tracks; private final ArrayList sampleStreams; - private final Handler handler; /* package */ final Loader loader; /* package */ final Format format; @@ -61,7 +60,7 @@ import java.util.Arrays; public SingleSampleMediaPeriod(Uri uri, DataSource.Factory dataSourceFactory, Format format, int minLoadableRetryCount, Handler eventHandler, EventListener eventListener, - int eventSourceId, final Callback callback) { + int eventSourceId) { this.uri = uri; this.dataSourceFactory = dataSourceFactory; this.format = format; @@ -71,20 +70,17 @@ import java.util.Arrays; 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 + public void prepare(Callback callback) { + callback.onPrepared(this); } @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 e1acfb42cd..385bebfb88 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 @@ -19,7 +19,6 @@ import android.net.Uri; import android.os.Handler; import com.google.android.exoplayer2.Format; 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.upstream.DataSource; import com.google.android.exoplayer2.util.Assertions; @@ -95,11 +94,10 @@ public final class SingleSampleMediaSource implements MediaSource { } @Override - public MediaPeriod createPeriod(int index, Callback callback, Allocator allocator, - long positionUs) { + public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { Assertions.checkArgument(index == 0); return new SingleSampleMediaPeriod(uri, dataSourceFactory, format, minLoadableRetryCount, - eventHandler, eventListener, eventSourceId, callback); + eventHandler, eventListener, eventSourceId); } @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 fbc5b8abf1..4a24c7c176 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,7 +15,6 @@ */ 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; @@ -49,11 +48,10 @@ import java.util.List; private final EventDispatcher eventDispatcher; private final long elapsedRealtimeOffset; private final LoaderErrorThrower manifestLoaderErrorThrower; - private final Callback callback; private final Allocator allocator; private final TrackGroupArray trackGroups; - private final Handler handler; + private Callback callback; private ChunkSampleStream[] sampleStreams; private CompositeSequenceableLoader sequenceableLoader; private DashManifest manifest; @@ -63,7 +61,7 @@ import java.util.List; public DashMediaPeriod(int id, DashManifest manifest, int index, DashChunkSource.Factory chunkSourceFactory, int minLoadableRetryCount, EventDispatcher eventDispatcher, long elapsedRealtimeOffset, - LoaderErrorThrower manifestLoaderErrorThrower, Callback callback, Allocator allocator) { + LoaderErrorThrower manifestLoaderErrorThrower, Allocator allocator) { this.id = id; this.manifest = manifest; this.index = index; @@ -72,19 +70,11 @@ import java.util.List; this.eventDispatcher = eventDispatcher; this.elapsedRealtimeOffset = elapsedRealtimeOffset; this.manifestLoaderErrorThrower = manifestLoaderErrorThrower; - this.callback = callback; this.allocator = allocator; sampleStreams = newSampleStreamArray(0); sequenceableLoader = new CompositeSequenceableLoader(sampleStreams); period = manifest.getPeriod(index); trackGroups = buildTrackGroups(period); - handler = new Handler(); - handler.post(new Runnable() { - @Override - public void run() { - DashMediaPeriod.this.callback.onPrepared(DashMediaPeriod.this); - } - }); } public void updateManifest(DashManifest manifest, int index) { @@ -103,7 +93,12 @@ import java.util.List; for (ChunkSampleStream sampleStream : sampleStreams) { sampleStream.release(); } - handler.removeCallbacksAndMessages(null); + } + + @Override + public void prepare(Callback callback) { + this.callback = callback; + callback.onPrepared(this); } @Override diff --git a/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java index a6e54ef4a1..766f1e0ebf 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java @@ -26,7 +26,6 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.source.MediaPeriod; -import com.google.android.exoplayer2.source.MediaPeriod.Callback; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.dash.manifest.DashManifest; import com.google.android.exoplayer2.source.dash.manifest.DashManifestParser; @@ -171,11 +170,10 @@ public final class DashMediaSource implements MediaSource { } @Override - public MediaPeriod createPeriod(int index, Callback callback, Allocator allocator, - long positionUs) { + public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { DashMediaPeriod mediaPeriod = new DashMediaPeriod(firstPeriodId + index, manifest, index, chunkSourceFactory, minLoadableRetryCount, eventDispatcher, elapsedRealtimeOffsetMs, loader, - callback, allocator); + allocator); periodsById.put(mediaPeriod.id, mediaPeriod); return mediaPeriod; } diff --git a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java index 9597e4be35..ceb47771a6 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java @@ -50,11 +50,11 @@ import java.util.List; /* package */ final class HlsMediaPeriod implements MediaPeriod, Loader.Callback>, HlsSampleStreamWrapper.Callback { + private final Uri manifestUri; private final DataSource.Factory dataSourceFactory; private final int minLoadableRetryCount; private final EventDispatcher eventDispatcher; private final MediaSource.Listener sourceListener; - private final Callback callback; private final Allocator allocator; private final IdentityHashMap streamWrapperIndices; private final TimestampAdjusterProvider timestampAdjusterProvider; @@ -64,6 +64,7 @@ import java.util.List; private final long preparePositionUs; private final Runnable continueLoadingRunnable; + private Callback callback; private int pendingPrepareCount; private HlsPlaylist playlist; private boolean seenFirstTrackSelection; @@ -76,13 +77,13 @@ import java.util.List; public HlsMediaPeriod(Uri manifestUri, DataSource.Factory dataSourceFactory, int minLoadableRetryCount, EventDispatcher eventDispatcher, - MediaSource.Listener sourceListener, final Callback callback, Allocator allocator, + MediaSource.Listener sourceListener, Allocator allocator, long positionUs) { + this.manifestUri = manifestUri; this.dataSourceFactory = dataSourceFactory; this.minLoadableRetryCount = minLoadableRetryCount; this.eventDispatcher = eventDispatcher; this.sourceListener = sourceListener; - this.callback = callback; this.allocator = allocator; streamWrapperIndices = new IdentityHashMap<>(); timestampAdjusterProvider = new TimestampAdjusterProvider(); @@ -96,11 +97,6 @@ import java.util.List; callback.onContinueLoadingRequested(HlsMediaPeriod.this); } }; - - ParsingLoadable loadable = new ParsingLoadable<>( - dataSourceFactory.createDataSource(), manifestUri, C.DATA_TYPE_MANIFEST, manifestParser); - long elapsedRealtimeMs = manifestFetcher.startLoading(loadable, this, minLoadableRetryCount); - eventDispatcher.loadStarted(loadable.dataSpec, loadable.type, elapsedRealtimeMs); } public void release() { @@ -111,6 +107,15 @@ import java.util.List; } } + @Override + public void prepare(Callback callback) { + this.callback = callback; + ParsingLoadable loadable = new ParsingLoadable<>( + dataSourceFactory.createDataSource(), manifestUri, C.DATA_TYPE_MANIFEST, manifestParser); + long elapsedRealtimeMs = manifestFetcher.startLoading(loadable, this, minLoadableRetryCount); + eventDispatcher.loadStarted(loadable.dataSpec, loadable.type, elapsedRealtimeMs); + } + @Override public void maybeThrowPrepareError() throws IOException { if (sampleStreamWrappers == null) { diff --git a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java index 72a9fd6c0c..b8b6c033b3 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java @@ -21,7 +21,6 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.source.MediaPeriod; -import com.google.android.exoplayer2.source.MediaPeriod.Callback; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.SinglePeriodTimeline; import com.google.android.exoplayer2.upstream.Allocator; @@ -73,11 +72,10 @@ public final class HlsMediaSource implements MediaSource { } @Override - public MediaPeriod createPeriod(int index, Callback callback, Allocator allocator, - long positionUs) { + public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { Assertions.checkArgument(index == 0); return new HlsMediaPeriod(manifestUri, dataSourceFactory, minLoadableRetryCount, - eventDispatcher, sourceListener, callback, allocator, positionUs); + eventDispatcher, sourceListener, allocator, positionUs); } @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 7dd1cda6d8..fef2480fd6 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,7 +15,6 @@ */ 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; @@ -47,24 +46,22 @@ import java.util.ArrayList; private final LoaderErrorThrower manifestLoaderErrorThrower; private final int minLoadableRetryCount; private final EventDispatcher eventDispatcher; - private final Callback callback; private final Allocator allocator; private final TrackGroupArray trackGroups; private final TrackEncryptionBox[] trackEncryptionBoxes; - private final Handler handler; + private Callback callback; private SsManifest manifest; private ChunkSampleStream[] sampleStreams; private CompositeSequenceableLoader sequenceableLoader; public SsMediaPeriod(SsManifest manifest, SsChunkSource.Factory chunkSourceFactory, int minLoadableRetryCount, EventDispatcher eventDispatcher, - LoaderErrorThrower manifestLoaderErrorThrower, Callback callback, Allocator allocator) { + LoaderErrorThrower manifestLoaderErrorThrower, Allocator allocator) { this.chunkSourceFactory = chunkSourceFactory; this.manifestLoaderErrorThrower = manifestLoaderErrorThrower; this.minLoadableRetryCount = minLoadableRetryCount; this.eventDispatcher = eventDispatcher; - this.callback = callback; this.allocator = allocator; trackGroups = buildTrackGroups(manifest); @@ -76,16 +73,9 @@ import java.util.ArrayList; } else { trackEncryptionBoxes = null; } - handler = new Handler(); this.manifest = manifest; sampleStreams = newSampleStreamArray(0); sequenceableLoader = new CompositeSequenceableLoader(sampleStreams); - handler.post(new Runnable() { - @Override - public void run() { - SsMediaPeriod.this.callback.onPrepared(SsMediaPeriod.this); - } - }); } public void updateManifest(SsManifest manifest) { @@ -100,7 +90,12 @@ import java.util.ArrayList; for (ChunkSampleStream sampleStream : sampleStreams) { sampleStream.release(); } - handler.removeCallbacksAndMessages(null); + } + + @Override + public void prepare(Callback callback) { + this.callback = callback; + callback.onPrepared(this); } @Override diff --git a/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java index ef8129e228..d328e5ecf2 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java @@ -24,7 +24,6 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.source.MediaPeriod; -import com.google.android.exoplayer2.source.MediaPeriod.Callback; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.SinglePeriodTimeline; import com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest; @@ -122,11 +121,10 @@ public final class SsMediaSource implements MediaSource, } @Override - public MediaPeriod createPeriod(int index, Callback callback, Allocator allocator, - long positionUs) { + public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { Assertions.checkArgument(index == 0); SsMediaPeriod period = new SsMediaPeriod(manifest, chunkSourceFactory, minLoadableRetryCount, - eventDispatcher, manifestLoader, callback, allocator); + eventDispatcher, manifestLoader, allocator); mediaPeriods.add(period); return period; }