From bc77c3eb8229f1bc9882c03edcdf49312658ecef Mon Sep 17 00:00:00 2001 From: eguven Date: Thu, 14 Jul 2016 08:54:27 -0700 Subject: [PATCH] Call MediaSource prepare/release methods in ExoPlayerImplInternal. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=127436600 --- .../exoplayer2/ExoPlayerImplInternal.java | 10 +++++++--- .../source/ConcatenatingMediaSource.java | 14 ++++++++++++++ .../source/ExtractorMediaSource.java | 14 ++++++++++++-- .../android/exoplayer2/source/MediaPeriod.java | 4 ++-- .../android/exoplayer2/source/MediaSource.java | 15 +++++++++++++++ .../exoplayer2/source/MergingMediaPeriod.java | 8 ++++---- .../exoplayer2/source/MergingMediaSource.java | 18 ++++++++++++++++-- .../source/SingleSampleMediaSource.java | 14 ++++++++++++-- .../source/dash/DashMediaPeriod.java | 4 ++-- .../source/dash/DashMediaSource.java | 10 ++++------ .../exoplayer2/source/hls/HlsMediaSource.java | 14 ++++++++++++-- .../SmoothStreamingMediaSource.java | 14 ++++++++++++-- 12 files changed, 112 insertions(+), 27 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 14265299d1..05a910e70f 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -314,6 +314,7 @@ import java.util.ArrayList; try { resetInternal(); this.mediaSource = mediaSource; + mediaSource.prepareSource(); setState(ExoPlayer.STATE_BUFFERING); handler.sendEmptyMessage(MSG_DO_SOME_WORK); } finally { @@ -538,7 +539,10 @@ import java.util.ArrayList; } } enabledRenderers = new Renderer[0]; - mediaSource = null; + if (mediaSource != null) { + mediaSource.releaseSource(); + mediaSource = null; + } timeline.reset(); loadControl.reset(); setIsLoading(false); @@ -654,7 +658,7 @@ import java.util.ArrayList; loadingPeriod = newPeriod; long startPositionUs = playingPeriod == null ? playbackInfo.positionUs : 0; setIsLoading(true); - loadingPeriod.mediaPeriod.prepare(ExoPlayerImplInternal.this, + loadingPeriod.mediaPeriod.preparePeriod(ExoPlayerImplInternal.this, loadControl.getAllocator(), startPositionUs); } } @@ -1096,7 +1100,7 @@ import java.util.ArrayList; public void release() { try { - mediaPeriod.release(); + mediaPeriod.releasePeriod(); } catch (RuntimeException e) { // There's nothing we can do. Log.e(TAG, "Period release failed.", e); 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 80da78c82e..00b6545654 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 @@ -29,6 +29,13 @@ public final class ConcatenatingMediaSource implements MediaSource { this.mediaSources = mediaSources; } + @Override + public void prepareSource() { + for (MediaSource mediaSource : mediaSources) { + mediaSource.prepareSource(); + } + } + @Override public int getPeriodCount() { int sourceCount = 0; @@ -55,4 +62,11 @@ public final class ConcatenatingMediaSource implements MediaSource { throw new IndexOutOfBoundsException(); } + @Override + public void releaseSource() { + for (MediaSource mediaSource : mediaSources) { + mediaSource.releaseSource(); + } + } + } 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 8941a62def..bf3ee0f055 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 @@ -186,6 +186,11 @@ public final class ExtractorMediaSource implements MediaPeriod, MediaSource, // MediaSource implementation. + @Override + public void prepareSource() { + // do nothing + } + @Override public int getPeriodCount() { return 1; @@ -197,10 +202,15 @@ public final class ExtractorMediaSource implements MediaPeriod, MediaSource, return this; } + @Override + public void releaseSource() { + // do nothing + } + // MediaPeriod implementation. @Override - public void prepare(Callback callback, Allocator allocator, long positionUs) { + public void preparePeriod(Callback callback, Allocator allocator, long positionUs) { this.callback = callback; this.allocator = allocator; @@ -345,7 +355,7 @@ public final class ExtractorMediaSource implements MediaPeriod, MediaSource, } @Override - public void release() { + public void releasePeriod() { dataSource = null; if (loader != null) { final ExtractorHolder extractorHolder = this.extractorHolder; 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 cc7effab73..ee2a679e22 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 @@ -55,7 +55,7 @@ public interface MediaPeriod extends SequenceableLoader { * @param allocator An {@link Allocator} from which to obtain media buffer allocations. * @param positionUs The player's current playback position. */ - void prepare(Callback callback, Allocator allocator, long positionUs); + void preparePeriod(Callback callback, Allocator allocator, long positionUs); /** * Throws an error that's preventing the period from becoming prepared. Does nothing if no such @@ -149,6 +149,6 @@ public interface MediaPeriod extends SequenceableLoader { * This method should be called when the period is no longer required. It may be called in any * state. */ - void release(); + void releasePeriod(); } 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 b88fd3c997..e099c23a0d 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 @@ -25,6 +25,13 @@ public interface MediaSource { */ int UNKNOWN_PERIOD_COUNT = -1; + /** + * Starts preparation of the source. + */ + void prepareSource(); + + // TODO add void maybeThrowError() throws IOException; + /** * Returns the number of periods in the source, or {@link #UNKNOWN_PERIOD_COUNT} if the number * of periods is not yet known. @@ -42,4 +49,12 @@ public interface MediaSource { */ MediaPeriod createPeriod(int index); + /** + * Releases the source. + *

+ * This method should be called when the source is no longer required. It may be called in any + * state. + */ + void releaseSource(); + } 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 62f2ef1291..92dfb55c8f 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 @@ -52,10 +52,10 @@ public final class MergingMediaPeriod implements MediaPeriod, MediaPeriod.Callba } @Override - public void prepare(Callback callback, Allocator allocator, long positionUs) { + public void preparePeriod(Callback callback, Allocator allocator, long positionUs) { this.callback = callback; for (MediaPeriod period : periods) { - period.prepare(this, allocator, positionUs); + period.preparePeriod(this, allocator, positionUs); } } @@ -157,9 +157,9 @@ public final class MergingMediaPeriod implements MediaPeriod, MediaPeriod.Callba } @Override - public void release() { + public void releasePeriod() { for (MediaPeriod period : periods) { - period.release(); + period.releasePeriod(); } } 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 dcd04e54be..691431eacf 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 @@ -36,12 +36,19 @@ public final class MergingMediaSource implements MediaSource { periodCount = mediaSources[0].getPeriodCount(); Assertions.checkState(periodCount != UNKNOWN_PERIOD_COUNT, "Child sources must have known period counts"); - for (int i = 1; i < mediaSources.length; i++) { - Assertions.checkState(mediaSources[i].getPeriodCount() == periodCount, + for (MediaSource mediaSource : mediaSources) { + Assertions.checkState(mediaSource.getPeriodCount() == periodCount, "Child sources must have equal period counts"); } } + @Override + public void prepareSource() { + for (MediaSource mediaSource : mediaSources) { + mediaSource.prepareSource(); + } + } + @Override public int getPeriodCount() { return periodCount; @@ -57,4 +64,11 @@ public final class MergingMediaSource implements MediaSource { return new MergingMediaPeriod(periods); } + @Override + public void releaseSource() { + for (MediaSource mediaSource : mediaSources) { + mediaSource.releaseSource(); + } + } + } 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 db88ddec7b..85f099c790 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 @@ -115,6 +115,11 @@ public final class SingleSampleMediaSource implements MediaPeriod, MediaSource, // MediaSource implementation. + @Override + public void prepareSource() { + // do nothing + } + @Override public int getPeriodCount() { return 1; @@ -126,10 +131,15 @@ public final class SingleSampleMediaSource implements MediaPeriod, MediaSource, return this; } + @Override + public void releaseSource() { + // do nothing + } + // MediaPeriod implementation. @Override - public void prepare(Callback callback, Allocator allocator, long positionUs) { + public void preparePeriod(Callback callback, Allocator allocator, long positionUs) { loader = new Loader("Loader:SingleSampleMediaSource"); callback.onPeriodPrepared(this); } @@ -192,7 +202,7 @@ public final class SingleSampleMediaSource implements MediaPeriod, MediaSource, } @Override - public void release() { + public void releasePeriod() { if (loader != null) { loader.release(); loader = null; 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 83c8573421..43a7ae018c 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 @@ -96,7 +96,7 @@ import java.util.List; // MediaPeriod implementation. @Override - public void prepare(Callback callback, Allocator allocator, long positionUs) { + public void preparePeriod(Callback callback, Allocator allocator, long positionUs) { this.callback = callback; this.allocator = allocator; sampleStreams = newSampleStreamArray(0); @@ -188,7 +188,7 @@ import java.util.List; } @Override - public void release() { + public void releasePeriod() { if (sampleStreams != null) { for (ChunkSampleStream sampleStream : sampleStreams) { sampleStream.release(); 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 ff582313e1..102d8daeb0 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 @@ -92,14 +92,12 @@ public final class DashMediaSource implements MediaSource { eventDispatcher = new EventDispatcher(eventHandler, eventListener); manifestParser = new MediaPresentationDescriptionParser(); manifestCallback = new ManifestCallback(); - // TODO: Remove this call when prepare() is a part of MediaSource. - prepare(dataSourceFactory); } // MediaSource implementation. - // TODO @Override - public void prepare(DataSourceFactory dataSourceFactory) { + @Override + public void prepareSource() { dataSource = dataSourceFactory.createDataSource(); loader = new Loader("Loader:DashMediaSource"); manifestRefreshHandler = new Handler(); @@ -122,8 +120,8 @@ public final class DashMediaSource implements MediaSource { return periods[index]; } - // TODO @Override - public void release() { + @Override + public void releaseSource() { dataSource = null; if (loader != null) { loader.release(); 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 71596eae7f..f5a0c23a8b 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 @@ -112,6 +112,11 @@ public final class HlsMediaSource implements MediaPeriod, MediaSource, // MediaSource implementation. + @Override + public void prepareSource() { + // do nothing + } + @Override public int getPeriodCount() { return 1; @@ -123,10 +128,15 @@ public final class HlsMediaSource implements MediaPeriod, MediaSource, return this; } + @Override + public void releaseSource() { + // do nothing + } + // MediaPeriod implementation. @Override - public void prepare(Callback callback, Allocator allocator, long positionUs) { + public void preparePeriod(Callback callback, Allocator allocator, long positionUs) { this.callback = callback; this.allocator = allocator; preparePositionUs = positionUs; @@ -228,7 +238,7 @@ public final class HlsMediaSource implements MediaPeriod, MediaSource, } @Override - public void release() { + public void releasePeriod() { sampleStreamSources.clear(); timestampAdjusterProvider.reset(); manifestDataSource = null; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SmoothStreamingMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SmoothStreamingMediaSource.java index d900ca5779..4a5694c3ff 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SmoothStreamingMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SmoothStreamingMediaSource.java @@ -112,6 +112,11 @@ public final class SmoothStreamingMediaSource implements MediaPeriod, MediaSourc // MediaSource implementation. + @Override + public void prepareSource() { + // do nothing + } + @Override public int getPeriodCount() { return 1; @@ -123,10 +128,15 @@ public final class SmoothStreamingMediaSource implements MediaPeriod, MediaSourc return this; } + @Override + public void releaseSource() { + // do nothing + } + // MediaPeriod implementation. @Override - public void prepare(Callback callback, Allocator allocator, long positionUs) { + public void preparePeriod(Callback callback, Allocator allocator, long positionUs) { this.callback = callback; this.allocator = allocator; sampleStreams = newSampleStreamArray(0); @@ -218,7 +228,7 @@ public final class SmoothStreamingMediaSource implements MediaPeriod, MediaSourc } @Override - public void release() { + public void releasePeriod() { manifestDataSource = null; if (manifestLoader != null) { manifestLoader.release();