Commit 4867748c by tonihei Committed by Oliver Woodman

Add assertions to check that media sources are not prepared twice.

This lets apps fail-fast when they try to reuse media source instances.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=180934445
parent 4b018b4d
...@@ -131,7 +131,8 @@ public final class ClippingMediaSource implements MediaSource, MediaSource.Liste ...@@ -131,7 +131,8 @@ public final class ClippingMediaSource implements MediaSource, MediaSource.Liste
@Override @Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
this.sourceListener = listener; Assertions.checkState(sourceListener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
sourceListener = listener;
mediaSource.prepareSource(player, false, this); mediaSource.prepareSource(player, false, this);
} }
......
...@@ -89,6 +89,7 @@ public final class ConcatenatingMediaSource implements MediaSource { ...@@ -89,6 +89,7 @@ public final class ConcatenatingMediaSource implements MediaSource {
@Override @Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkState(this.listener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
this.listener = listener; this.listener = listener;
if (mediaSources.length == 0) { if (mediaSources.length == 0) {
listener.onSourceInfoRefreshed(this, Timeline.EMPTY, null); listener.onSourceInfoRefreshed(this, Timeline.EMPTY, null);
......
...@@ -331,6 +331,7 @@ public final class DynamicConcatenatingMediaSource implements MediaSource, Playe ...@@ -331,6 +331,7 @@ public final class DynamicConcatenatingMediaSource implements MediaSource, Playe
@Override @Override
public synchronized void prepareSource(ExoPlayer player, boolean isTopLevelSource, public synchronized void prepareSource(ExoPlayer player, boolean isTopLevelSource,
Listener listener) { Listener listener) {
Assertions.checkState(this.listener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
this.player = player; this.player = player;
this.listener = listener; this.listener = listener;
preventListenerNotification = true; preventListenerNotification = true;
......
...@@ -325,6 +325,7 @@ public final class ExtractorMediaSource implements MediaSource, ExtractorMediaPe ...@@ -325,6 +325,7 @@ public final class ExtractorMediaSource implements MediaSource, ExtractorMediaPe
@Override @Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkState(sourceListener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
sourceListener = listener; sourceListener = listener;
notifySourceInfoRefreshed(C.TIME_UNSET, false); notifySourceInfoRefreshed(C.TIME_UNSET, false);
} }
...@@ -356,7 +357,7 @@ public final class ExtractorMediaSource implements MediaSource, ExtractorMediaPe ...@@ -356,7 +357,7 @@ public final class ExtractorMediaSource implements MediaSource, ExtractorMediaPe
@Override @Override
public void releaseSource() { public void releaseSource() {
sourceListener = null; // Do nothing.
} }
// ExtractorMediaPeriod.Listener implementation. // ExtractorMediaPeriod.Listener implementation.
......
...@@ -36,6 +36,7 @@ public final class LoopingMediaSource implements MediaSource { ...@@ -36,6 +36,7 @@ public final class LoopingMediaSource implements MediaSource {
private final int loopCount; private final int loopCount;
private int childPeriodCount; private int childPeriodCount;
private boolean wasPrepareSourceCalled;
/** /**
* Loops the provided source indefinitely. Note that it is usually better to use * Loops the provided source indefinitely. Note that it is usually better to use
...@@ -61,6 +62,8 @@ public final class LoopingMediaSource implements MediaSource { ...@@ -61,6 +62,8 @@ public final class LoopingMediaSource implements MediaSource {
@Override @Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, final Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, final Listener listener) {
Assertions.checkState(!wasPrepareSourceCalled, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
wasPrepareSourceCalled = true;
childSource.prepareSource(player, false, new Listener() { childSource.prepareSource(player, false, new Listener() {
@Override @Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline, Object manifest) { public void onSourceInfoRefreshed(MediaSource source, Timeline timeline, Object manifest) {
......
...@@ -149,6 +149,8 @@ public interface MediaSource { ...@@ -149,6 +149,8 @@ public interface MediaSource {
} }
String MEDIA_SOURCE_REUSED_ERROR_MESSAGE = "MediaSource instances are not allowed to be reused.";
/** /**
* Starts preparation of the source. * Starts preparation of the source.
* <p> * <p>
......
...@@ -19,6 +19,7 @@ import android.support.annotation.IntDef; ...@@ -19,6 +19,7 @@ import android.support.annotation.IntDef;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.util.Assertions;
import java.io.IOException; import java.io.IOException;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
...@@ -97,6 +98,7 @@ public final class MergingMediaSource implements MediaSource { ...@@ -97,6 +98,7 @@ public final class MergingMediaSource implements MediaSource {
@Override @Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkState(this.listener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
this.listener = listener; this.listener = listener;
for (int i = 0; i < mediaSources.length; i++) { for (int i = 0; i < mediaSources.length; i++) {
final int sourceIndex = i; final int sourceIndex = i;
......
...@@ -158,6 +158,8 @@ public final class SingleSampleMediaSource implements MediaSource { ...@@ -158,6 +158,8 @@ public final class SingleSampleMediaSource implements MediaSource {
private final boolean treatLoadErrorsAsEndOfStream; private final boolean treatLoadErrorsAsEndOfStream;
private final Timeline timeline; private final Timeline timeline;
private boolean isPrepared;
/** /**
* @param uri The {@link Uri} of the media stream. * @param uri The {@link Uri} of the media stream.
* @param dataSourceFactory The factory from which the {@link DataSource} to read the media will * @param dataSourceFactory The factory from which the {@link DataSource} to read the media will
...@@ -251,6 +253,8 @@ public final class SingleSampleMediaSource implements MediaSource { ...@@ -251,6 +253,8 @@ public final class SingleSampleMediaSource implements MediaSource {
@Override @Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkState(!isPrepared, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
isPrepared = true;
listener.onSourceInfoRefreshed(this, timeline, null); listener.onSourceInfoRefreshed(this, timeline, null);
} }
......
...@@ -204,6 +204,7 @@ public final class AdsMediaSource implements MediaSource { ...@@ -204,6 +204,7 @@ public final class AdsMediaSource implements MediaSource {
@Override @Override
public void prepareSource(final ExoPlayer player, boolean isTopLevelSource, Listener listener) { public void prepareSource(final ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkArgument(isTopLevelSource); Assertions.checkArgument(isTopLevelSource);
Assertions.checkState(this.listener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
this.listener = listener; this.listener = listener;
this.player = player; this.player = player;
playerHandler = new Handler(); playerHandler = new Handler();
......
...@@ -483,6 +483,7 @@ public final class DashMediaSource implements MediaSource { ...@@ -483,6 +483,7 @@ public final class DashMediaSource implements MediaSource {
@Override @Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkState(sourceListener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
sourceListener = listener; sourceListener = listener;
if (sideloadedManifest) { if (sideloadedManifest) {
loaderErrorThrower = new LoaderErrorThrower.Dummy(); loaderErrorThrower = new LoaderErrorThrower.Dummy();
......
...@@ -324,7 +324,7 @@ public final class HlsMediaSource implements MediaSource, ...@@ -324,7 +324,7 @@ public final class HlsMediaSource implements MediaSource,
@Override @Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkState(playlistTracker == null); Assertions.checkState(sourceListener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
playlistTracker = new HlsPlaylistTracker(manifestUri, dataSourceFactory, eventDispatcher, playlistTracker = new HlsPlaylistTracker(manifestUri, dataSourceFactory, eventDispatcher,
minLoadableRetryCount, this, playlistParser); minLoadableRetryCount, this, playlistParser);
sourceListener = listener; sourceListener = listener;
...@@ -361,7 +361,6 @@ public final class HlsMediaSource implements MediaSource, ...@@ -361,7 +361,6 @@ public final class HlsMediaSource implements MediaSource,
playlistTracker.release(); playlistTracker.release();
playlistTracker = null; playlistTracker = null;
} }
sourceListener = null;
} }
@Override @Override
......
...@@ -419,6 +419,7 @@ public final class SsMediaSource implements MediaSource, ...@@ -419,6 +419,7 @@ public final class SsMediaSource implements MediaSource,
@Override @Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkState(sourceListener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
sourceListener = listener; sourceListener = listener;
if (manifest != null) { if (manifest != null) {
manifestLoaderErrorThrower = new LoaderErrorThrower.Dummy(); manifestLoaderErrorThrower = new LoaderErrorThrower.Dummy();
...@@ -455,7 +456,6 @@ public final class SsMediaSource implements MediaSource, ...@@ -455,7 +456,6 @@ public final class SsMediaSource implements MediaSource,
@Override @Override
public void releaseSource() { public void releaseSource() {
sourceListener = null;
manifest = null; manifest = null;
manifestDataSource = null; manifestDataSource = null;
manifestLoadStartTimestamp = 0; manifestLoadStartTimestamp = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment