mirror of
https://github.com/androidx/media.git
synced 2025-05-09 16:40:55 +08:00
Remove player and isTopLevelSource parameters from MediaSource.prepare.
They are not longer needed anywhere, are error-prone (because of threading requirements), and complicate testing and using MediaSources without a player. PiperOrigin-RevId: 227871157
This commit is contained in:
parent
5fc975b728
commit
a973b6f34f
@ -18,7 +18,6 @@ package com.google.android.exoplayer2.ext.ima;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import com.google.android.exoplayer2.ExoPlayer;
|
|
||||||
import com.google.android.exoplayer2.Timeline;
|
import com.google.android.exoplayer2.Timeline;
|
||||||
import com.google.android.exoplayer2.source.BaseMediaSource;
|
import com.google.android.exoplayer2.source.BaseMediaSource;
|
||||||
import com.google.android.exoplayer2.source.MediaPeriod;
|
import com.google.android.exoplayer2.source.MediaPeriod;
|
||||||
@ -33,7 +32,8 @@ import java.io.IOException;
|
|||||||
/**
|
/**
|
||||||
* A {@link MediaSource} that inserts ads linearly with a provided content media source.
|
* A {@link MediaSource} that inserts ads linearly with a provided content media source.
|
||||||
*
|
*
|
||||||
* @deprecated Use com.google.android.exoplayer2.source.ads.AdsMediaSource with ImaAdsLoader.
|
* @deprecated Use {@link com.google.android.exoplayer2.source.ads.AdsMediaSource} with
|
||||||
|
* ImaAdsLoader.
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public final class ImaAdsMediaSource extends BaseMediaSource implements SourceInfoRefreshListener {
|
public final class ImaAdsMediaSource extends BaseMediaSource implements SourceInfoRefreshListener {
|
||||||
@ -83,12 +83,8 @@ public final class ImaAdsMediaSource extends BaseMediaSource implements SourceIn
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void prepareSourceInternal(
|
public void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
|
||||||
final ExoPlayer player,
|
adsMediaSource.prepareSource(/* listener= */ this, mediaTransferListener);
|
||||||
boolean isTopLevelSource,
|
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
|
||||||
adsMediaSource.prepareSource(
|
|
||||||
player, isTopLevelSource, /* listener= */ this, mediaTransferListener);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -138,7 +138,6 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
repeatMode,
|
repeatMode,
|
||||||
shuffleModeEnabled,
|
shuffleModeEnabled,
|
||||||
eventHandler,
|
eventHandler,
|
||||||
this,
|
|
||||||
clock);
|
clock);
|
||||||
internalPlayerHandler = new Handler(internalPlayer.getPlaybackLooper());
|
internalPlayerHandler = new Handler(internalPlayer.getPlaybackLooper());
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,6 @@ import java.util.Collections;
|
|||||||
private final HandlerWrapper handler;
|
private final HandlerWrapper handler;
|
||||||
private final HandlerThread internalPlaybackThread;
|
private final HandlerThread internalPlaybackThread;
|
||||||
private final Handler eventHandler;
|
private final Handler eventHandler;
|
||||||
private final ExoPlayer player;
|
|
||||||
private final Timeline.Window window;
|
private final Timeline.Window window;
|
||||||
private final Timeline.Period period;
|
private final Timeline.Period period;
|
||||||
private final long backBufferDurationUs;
|
private final long backBufferDurationUs;
|
||||||
@ -131,7 +130,6 @@ import java.util.Collections;
|
|||||||
@Player.RepeatMode int repeatMode,
|
@Player.RepeatMode int repeatMode,
|
||||||
boolean shuffleModeEnabled,
|
boolean shuffleModeEnabled,
|
||||||
Handler eventHandler,
|
Handler eventHandler,
|
||||||
ExoPlayer player,
|
|
||||||
Clock clock) {
|
Clock clock) {
|
||||||
this.renderers = renderers;
|
this.renderers = renderers;
|
||||||
this.trackSelector = trackSelector;
|
this.trackSelector = trackSelector;
|
||||||
@ -142,7 +140,6 @@ import java.util.Collections;
|
|||||||
this.repeatMode = repeatMode;
|
this.repeatMode = repeatMode;
|
||||||
this.shuffleModeEnabled = shuffleModeEnabled;
|
this.shuffleModeEnabled = shuffleModeEnabled;
|
||||||
this.eventHandler = eventHandler;
|
this.eventHandler = eventHandler;
|
||||||
this.player = player;
|
|
||||||
this.clock = clock;
|
this.clock = clock;
|
||||||
this.queue = new MediaPeriodQueue();
|
this.queue = new MediaPeriodQueue();
|
||||||
|
|
||||||
@ -398,11 +395,7 @@ import java.util.Collections;
|
|||||||
loadControl.onPrepared();
|
loadControl.onPrepared();
|
||||||
this.mediaSource = mediaSource;
|
this.mediaSource = mediaSource;
|
||||||
setState(Player.STATE_BUFFERING);
|
setState(Player.STATE_BUFFERING);
|
||||||
mediaSource.prepareSource(
|
mediaSource.prepareSource(/* listener= */ this, bandwidthMeter.getTransferListener());
|
||||||
player,
|
|
||||||
/* isTopLevelSource= */ true,
|
|
||||||
/* listener= */ this,
|
|
||||||
bandwidthMeter.getTransferListener());
|
|
||||||
handler.sendEmptyMessage(MSG_DO_SOME_WORK);
|
handler.sendEmptyMessage(MSG_DO_SOME_WORK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,8 +16,8 @@
|
|||||||
package com.google.android.exoplayer2.source;
|
package com.google.android.exoplayer2.source;
|
||||||
|
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.ExoPlayer;
|
|
||||||
import com.google.android.exoplayer2.Timeline;
|
import com.google.android.exoplayer2.Timeline;
|
||||||
import com.google.android.exoplayer2.upstream.TransferListener;
|
import com.google.android.exoplayer2.upstream.TransferListener;
|
||||||
import com.google.android.exoplayer2.util.Assertions;
|
import com.google.android.exoplayer2.util.Assertions;
|
||||||
@ -35,9 +35,9 @@ public abstract class BaseMediaSource implements MediaSource {
|
|||||||
private final ArrayList<SourceInfoRefreshListener> sourceInfoListeners;
|
private final ArrayList<SourceInfoRefreshListener> sourceInfoListeners;
|
||||||
private final MediaSourceEventListener.EventDispatcher eventDispatcher;
|
private final MediaSourceEventListener.EventDispatcher eventDispatcher;
|
||||||
|
|
||||||
private @Nullable ExoPlayer player;
|
@Nullable private Looper looper;
|
||||||
private @Nullable Timeline timeline;
|
@Nullable private Timeline timeline;
|
||||||
private @Nullable Object manifest;
|
@Nullable private Object manifest;
|
||||||
|
|
||||||
public BaseMediaSource() {
|
public BaseMediaSource() {
|
||||||
sourceInfoListeners = new ArrayList<>(/* initialCapacity= */ 1);
|
sourceInfoListeners = new ArrayList<>(/* initialCapacity= */ 1);
|
||||||
@ -48,21 +48,16 @@ public abstract class BaseMediaSource implements MediaSource {
|
|||||||
* Starts source preparation. This method is called at most once until the next call to {@link
|
* Starts source preparation. This method is called at most once until the next call to {@link
|
||||||
* #releaseSourceInternal()}.
|
* #releaseSourceInternal()}.
|
||||||
*
|
*
|
||||||
* @param player The player for which this source is being prepared.
|
|
||||||
* @param isTopLevelSource Whether this source has been passed directly to {@link
|
|
||||||
* ExoPlayer#prepare(MediaSource)} or {@link ExoPlayer#prepare(MediaSource, boolean,
|
|
||||||
* boolean)}.
|
|
||||||
* @param mediaTransferListener The transfer listener which should be informed of any media data
|
* @param mediaTransferListener The transfer listener which should be informed of any media data
|
||||||
* transfers. May be null if no listener is available. Note that this listener should usually
|
* transfers. May be null if no listener is available. Note that this listener should usually
|
||||||
* be only informed of transfers related to the media loads and not of auxiliary loads for
|
* be only informed of transfers related to the media loads and not of auxiliary loads for
|
||||||
* manifests and other data.
|
* manifests and other data.
|
||||||
*/
|
*/
|
||||||
protected abstract void prepareSourceInternal(
|
protected abstract void prepareSourceInternal(@Nullable TransferListener mediaTransferListener);
|
||||||
ExoPlayer player, boolean isTopLevelSource, @Nullable TransferListener mediaTransferListener);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Releases the source. This method is called exactly once after each call to {@link
|
* Releases the source. This method is called exactly once after each call to {@link
|
||||||
* #prepareSourceInternal(ExoPlayer, boolean, TransferListener)}.
|
* #prepareSourceInternal(TransferListener)}.
|
||||||
*/
|
*/
|
||||||
protected abstract void releaseSourceInternal();
|
protected abstract void releaseSourceInternal();
|
||||||
|
|
||||||
@ -135,21 +130,14 @@ public abstract class BaseMediaSource implements MediaSource {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void prepareSource(
|
public final void prepareSource(
|
||||||
ExoPlayer player, boolean isTopLevelSource, SourceInfoRefreshListener listener) {
|
|
||||||
prepareSource(player, isTopLevelSource, listener, /* mediaTransferListener= */ null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public final void prepareSource(
|
|
||||||
ExoPlayer player,
|
|
||||||
boolean isTopLevelSource,
|
|
||||||
SourceInfoRefreshListener listener,
|
SourceInfoRefreshListener listener,
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
@Nullable TransferListener mediaTransferListener) {
|
||||||
Assertions.checkArgument(this.player == null || this.player == player);
|
Looper looper = Looper.myLooper();
|
||||||
|
Assertions.checkArgument(this.looper == null || this.looper == looper);
|
||||||
sourceInfoListeners.add(listener);
|
sourceInfoListeners.add(listener);
|
||||||
if (this.player == null) {
|
if (this.looper == null) {
|
||||||
this.player = player;
|
this.looper = looper;
|
||||||
prepareSourceInternal(player, isTopLevelSource, mediaTransferListener);
|
prepareSourceInternal(mediaTransferListener);
|
||||||
} else if (timeline != null) {
|
} else if (timeline != null) {
|
||||||
listener.onSourceInfoRefreshed(/* source= */ this, timeline, manifest);
|
listener.onSourceInfoRefreshed(/* source= */ this, timeline, manifest);
|
||||||
}
|
}
|
||||||
@ -159,7 +147,7 @@ public abstract class BaseMediaSource implements MediaSource {
|
|||||||
public final void releaseSource(SourceInfoRefreshListener listener) {
|
public final void releaseSource(SourceInfoRefreshListener listener) {
|
||||||
sourceInfoListeners.remove(listener);
|
sourceInfoListeners.remove(listener);
|
||||||
if (sourceInfoListeners.isEmpty()) {
|
if (sourceInfoListeners.isEmpty()) {
|
||||||
player = null;
|
looper = null;
|
||||||
timeline = null;
|
timeline = null;
|
||||||
manifest = null;
|
manifest = null;
|
||||||
releaseSourceInternal();
|
releaseSourceInternal();
|
||||||
|
@ -18,7 +18,6 @@ package com.google.android.exoplayer2.source;
|
|||||||
import android.support.annotation.IntDef;
|
import android.support.annotation.IntDef;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
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.upstream.TransferListener;
|
import com.google.android.exoplayer2.upstream.TransferListener;
|
||||||
@ -223,11 +222,8 @@ public final class ClippingMediaSource extends CompositeMediaSource<Void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void prepareSourceInternal(
|
public void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
|
||||||
ExoPlayer player,
|
super.prepareSourceInternal(mediaTransferListener);
|
||||||
boolean isTopLevelSource,
|
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
|
||||||
super.prepareSourceInternal(player, isTopLevelSource, mediaTransferListener);
|
|
||||||
prepareChildSource(/* id= */ null, mediaSource);
|
prepareChildSource(/* id= */ null, mediaSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,7 +18,6 @@ package com.google.android.exoplayer2.source;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.support.annotation.CallSuper;
|
import android.support.annotation.CallSuper;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.ExoPlayer;
|
|
||||||
import com.google.android.exoplayer2.Timeline;
|
import com.google.android.exoplayer2.Timeline;
|
||||||
import com.google.android.exoplayer2.upstream.TransferListener;
|
import com.google.android.exoplayer2.upstream.TransferListener;
|
||||||
import com.google.android.exoplayer2.util.Assertions;
|
import com.google.android.exoplayer2.util.Assertions;
|
||||||
@ -35,7 +34,6 @@ public abstract class CompositeMediaSource<T> extends BaseMediaSource {
|
|||||||
|
|
||||||
private final HashMap<T, MediaSourceAndListener> childSources;
|
private final HashMap<T, MediaSourceAndListener> childSources;
|
||||||
|
|
||||||
private @Nullable ExoPlayer player;
|
|
||||||
private @Nullable Handler eventHandler;
|
private @Nullable Handler eventHandler;
|
||||||
private @Nullable TransferListener mediaTransferListener;
|
private @Nullable TransferListener mediaTransferListener;
|
||||||
|
|
||||||
@ -46,11 +44,7 @@ public abstract class CompositeMediaSource<T> extends BaseMediaSource {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@CallSuper
|
@CallSuper
|
||||||
public void prepareSourceInternal(
|
public void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
|
||||||
ExoPlayer player,
|
|
||||||
boolean isTopLevelSource,
|
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
|
||||||
this.player = player;
|
|
||||||
this.mediaTransferListener = mediaTransferListener;
|
this.mediaTransferListener = mediaTransferListener;
|
||||||
eventHandler = new Handler();
|
eventHandler = new Handler();
|
||||||
}
|
}
|
||||||
@ -71,7 +65,6 @@ public abstract class CompositeMediaSource<T> extends BaseMediaSource {
|
|||||||
childSource.mediaSource.removeEventListener(childSource.eventListener);
|
childSource.mediaSource.removeEventListener(childSource.eventListener);
|
||||||
}
|
}
|
||||||
childSources.clear();
|
childSources.clear();
|
||||||
player = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -105,11 +98,7 @@ public abstract class CompositeMediaSource<T> extends BaseMediaSource {
|
|||||||
MediaSourceEventListener eventListener = new ForwardingEventListener(id);
|
MediaSourceEventListener eventListener = new ForwardingEventListener(id);
|
||||||
childSources.put(id, new MediaSourceAndListener(mediaSource, sourceListener, eventListener));
|
childSources.put(id, new MediaSourceAndListener(mediaSource, sourceListener, eventListener));
|
||||||
mediaSource.addEventListener(Assertions.checkNotNull(eventHandler), eventListener);
|
mediaSource.addEventListener(Assertions.checkNotNull(eventHandler), eventListener);
|
||||||
mediaSource.prepareSource(
|
mediaSource.prepareSource(sourceListener, mediaTransferListener);
|
||||||
Assertions.checkNotNull(player),
|
|
||||||
/* isTopLevelSource= */ false,
|
|
||||||
sourceListener,
|
|
||||||
mediaTransferListener);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -22,7 +22,6 @@ import android.support.annotation.NonNull;
|
|||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.ExoPlayer;
|
|
||||||
import com.google.android.exoplayer2.Timeline;
|
import com.google.android.exoplayer2.Timeline;
|
||||||
import com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder;
|
import com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder;
|
||||||
import com.google.android.exoplayer2.source.ShuffleOrder.DefaultShuffleOrder;
|
import com.google.android.exoplayer2.source.ShuffleOrder.DefaultShuffleOrder;
|
||||||
@ -428,10 +427,8 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final synchronized void prepareSourceInternal(
|
public final synchronized void prepareSourceInternal(
|
||||||
ExoPlayer player,
|
|
||||||
boolean isTopLevelSource,
|
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
@Nullable TransferListener mediaTransferListener) {
|
||||||
super.prepareSourceInternal(player, isTopLevelSource, mediaTransferListener);
|
super.prepareSourceInternal(mediaTransferListener);
|
||||||
playbackThreadHandler = new Handler(/* callback= */ this::handleMessage);
|
playbackThreadHandler = new Handler(/* callback= */ this::handleMessage);
|
||||||
if (mediaSourcesPublic.isEmpty()) {
|
if (mediaSourcesPublic.isEmpty()) {
|
||||||
updateTimelineAndScheduleOnCompletionActions();
|
updateTimelineAndScheduleOnCompletionActions();
|
||||||
@ -1163,10 +1160,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
|||||||
private static final class DummyMediaSource extends BaseMediaSource {
|
private static final class DummyMediaSource extends BaseMediaSource {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void prepareSourceInternal(
|
protected void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
|
||||||
ExoPlayer player,
|
|
||||||
boolean isTopLevelSource,
|
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
|
||||||
// Do nothing.
|
// Do nothing.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,6 @@ import android.net.Uri;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.ExoPlayer;
|
|
||||||
import com.google.android.exoplayer2.Player;
|
import com.google.android.exoplayer2.Player;
|
||||||
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
|
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
|
||||||
import com.google.android.exoplayer2.extractor.Extractor;
|
import com.google.android.exoplayer2.extractor.Extractor;
|
||||||
@ -365,10 +364,7 @@ public final class ExtractorMediaSource extends BaseMediaSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void prepareSourceInternal(
|
public void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
|
||||||
ExoPlayer player,
|
|
||||||
boolean isTopLevelSource,
|
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
|
||||||
transferListener = mediaTransferListener;
|
transferListener = mediaTransferListener;
|
||||||
notifySourceInfoRefreshed(timelineDurationUs, timelineIsSeekable);
|
notifySourceInfoRefreshed(timelineDurationUs, timelineIsSeekable);
|
||||||
}
|
}
|
||||||
|
@ -71,11 +71,8 @@ public final class LoopingMediaSource extends CompositeMediaSource<Void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void prepareSourceInternal(
|
public void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
|
||||||
ExoPlayer player,
|
super.prepareSourceInternal(mediaTransferListener);
|
||||||
boolean isTopLevelSource,
|
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
|
||||||
super.prepareSourceInternal(player, isTopLevelSource, mediaTransferListener);
|
|
||||||
prepareChildSource(/* id= */ null, childSource);
|
prepareChildSource(/* id= */ null, childSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,30 +18,30 @@ package com.google.android.exoplayer2.source;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
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.upstream.TransferListener;
|
import com.google.android.exoplayer2.upstream.TransferListener;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines and provides media to be played by an {@link ExoPlayer}. A MediaSource has two main
|
* Defines and provides media to be played by an {@link com.google.android.exoplayer2.ExoPlayer}. A
|
||||||
* responsibilities:
|
* MediaSource has two main responsibilities:
|
||||||
*
|
*
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>To provide the player with a {@link Timeline} defining the structure of its media, and to
|
* <li>To provide the player with a {@link Timeline} defining the structure of its media, and to
|
||||||
* provide a new timeline whenever the structure of the media changes. The MediaSource
|
* provide a new timeline whenever the structure of the media changes. The MediaSource
|
||||||
* provides these timelines by calling {@link SourceInfoRefreshListener#onSourceInfoRefreshed}
|
* provides these timelines by calling {@link SourceInfoRefreshListener#onSourceInfoRefreshed}
|
||||||
* on the {@link SourceInfoRefreshListener}s passed to {@link #prepareSource(ExoPlayer,
|
* on the {@link SourceInfoRefreshListener}s passed to {@link
|
||||||
* boolean, SourceInfoRefreshListener, TransferListener)}.
|
* #prepareSource(SourceInfoRefreshListener, TransferListener)}.
|
||||||
* <li>To provide {@link MediaPeriod} instances for the periods in its timeline. MediaPeriods are
|
* <li>To provide {@link MediaPeriod} instances for the periods in its timeline. MediaPeriods are
|
||||||
* obtained by calling {@link #createPeriod(MediaPeriodId, Allocator, long)}, and provide a
|
* obtained by calling {@link #createPeriod(MediaPeriodId, Allocator, long)}, and provide a
|
||||||
* way for the player to load and read the media.
|
* way for the player to load and read the media.
|
||||||
* </ul>
|
* </ul>
|
||||||
*
|
*
|
||||||
* All methods are called on the player's internal playback thread, as described in the {@link
|
* All methods are called on the player's internal playback thread, as described in the {@link
|
||||||
* ExoPlayer} Javadoc. They should not be called directly from application code. Instances can be
|
* com.google.android.exoplayer2.ExoPlayer} Javadoc. They should not be called directly from
|
||||||
* re-used, but only for one {@link ExoPlayer} instance simultaneously.
|
* application code. Instances can be re-used, but only for one {@link
|
||||||
|
* com.google.android.exoplayer2.ExoPlayer} instance simultaneously.
|
||||||
*/
|
*/
|
||||||
public interface MediaSource {
|
public interface MediaSource {
|
||||||
|
|
||||||
@ -242,11 +242,6 @@ public interface MediaSource {
|
|||||||
* <p>For each call to this method, a call to {@link #releaseSource(SourceInfoRefreshListener)} is
|
* <p>For each call to this method, a call to {@link #releaseSource(SourceInfoRefreshListener)} is
|
||||||
* needed to remove the listener and to release the source if no longer required.
|
* needed to remove the listener and to release the source if no longer required.
|
||||||
*
|
*
|
||||||
* @param player The player for which this source is being prepared.
|
|
||||||
* @param isTopLevelSource Whether this source has been passed directly to {@link
|
|
||||||
* ExoPlayer#prepare(MediaSource)} or {@link ExoPlayer#prepare(MediaSource, boolean,
|
|
||||||
* boolean)}. If {@code false}, this source is being prepared by another source (e.g. {@link
|
|
||||||
* ConcatenatingMediaSource}) for composition.
|
|
||||||
* @param listener The listener to be added.
|
* @param listener The listener to be added.
|
||||||
* @param mediaTransferListener The transfer listener which should be informed of any media data
|
* @param mediaTransferListener The transfer listener which should be informed of any media data
|
||||||
* transfers. May be null if no listener is available. Note that this listener should be only
|
* transfers. May be null if no listener is available. Note that this listener should be only
|
||||||
@ -254,8 +249,6 @@ public interface MediaSource {
|
|||||||
* and other data.
|
* and other data.
|
||||||
*/
|
*/
|
||||||
void prepareSource(
|
void prepareSource(
|
||||||
ExoPlayer player,
|
|
||||||
boolean isTopLevelSource,
|
|
||||||
SourceInfoRefreshListener listener,
|
SourceInfoRefreshListener listener,
|
||||||
@Nullable TransferListener mediaTransferListener);
|
@Nullable TransferListener mediaTransferListener);
|
||||||
|
|
||||||
|
@ -17,7 +17,6 @@ package com.google.android.exoplayer2.source;
|
|||||||
|
|
||||||
import android.support.annotation.IntDef;
|
import android.support.annotation.IntDef;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
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.upstream.TransferListener;
|
import com.google.android.exoplayer2.upstream.TransferListener;
|
||||||
@ -105,11 +104,8 @@ public final class MergingMediaSource extends CompositeMediaSource<Integer> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void prepareSourceInternal(
|
public void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
|
||||||
ExoPlayer player,
|
super.prepareSourceInternal(mediaTransferListener);
|
||||||
boolean isTopLevelSource,
|
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
|
||||||
super.prepareSourceInternal(player, isTopLevelSource, mediaTransferListener);
|
|
||||||
for (int i = 0; i < mediaSources.length; i++) {
|
for (int i = 0; i < mediaSources.length; i++) {
|
||||||
prepareChildSource(i, mediaSources[i]);
|
prepareChildSource(i, mediaSources[i]);
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,6 @@ package com.google.android.exoplayer2.source;
|
|||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.ExoPlayer;
|
|
||||||
import com.google.android.exoplayer2.Format;
|
import com.google.android.exoplayer2.Format;
|
||||||
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;
|
||||||
@ -304,10 +303,7 @@ public final class SingleSampleMediaSource extends BaseMediaSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void prepareSourceInternal(
|
public void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
|
||||||
ExoPlayer player,
|
|
||||||
boolean isTopLevelSource,
|
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
|
||||||
transferListener = mediaTransferListener;
|
transferListener = mediaTransferListener;
|
||||||
refreshSourceInfo(timeline, /* manifest= */ null);
|
refreshSourceInfo(timeline, /* manifest= */ null);
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,6 @@ import android.support.annotation.IntDef;
|
|||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.ExoPlayer;
|
|
||||||
import com.google.android.exoplayer2.Timeline;
|
import com.google.android.exoplayer2.Timeline;
|
||||||
import com.google.android.exoplayer2.source.CompositeMediaSource;
|
import com.google.android.exoplayer2.source.CompositeMediaSource;
|
||||||
import com.google.android.exoplayer2.source.DeferredMediaPeriod;
|
import com.google.android.exoplayer2.source.DeferredMediaPeriod;
|
||||||
@ -326,12 +325,9 @@ public final class AdsMediaSource extends CompositeMediaSource<MediaPeriodId> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void prepareSourceInternal(
|
public void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
|
||||||
final ExoPlayer player,
|
super.prepareSourceInternal(mediaTransferListener);
|
||||||
boolean isTopLevelSource,
|
ComponentListener componentListener = new ComponentListener();
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
|
||||||
super.prepareSourceInternal(player, isTopLevelSource, mediaTransferListener);
|
|
||||||
final ComponentListener componentListener = new ComponentListener();
|
|
||||||
this.componentListener = componentListener;
|
this.componentListener = componentListener;
|
||||||
prepareChildSource(DUMMY_CONTENT_MEDIA_PERIOD_ID, contentMediaSource);
|
prepareChildSource(DUMMY_CONTENT_MEDIA_PERIOD_ID, contentMediaSource);
|
||||||
mainHandler.post(() -> adsLoader.start(componentListener, adUiViewGroup));
|
mainHandler.post(() -> adsLoader.start(componentListener, adUiViewGroup));
|
||||||
|
@ -267,10 +267,8 @@ public final class ExoPlayerTest {
|
|||||||
new FakeMediaSource(timeline, new Object(), Builder.VIDEO_FORMAT) {
|
new FakeMediaSource(timeline, new Object(), Builder.VIDEO_FORMAT) {
|
||||||
@Override
|
@Override
|
||||||
public synchronized void prepareSourceInternal(
|
public synchronized void prepareSourceInternal(
|
||||||
ExoPlayer player,
|
|
||||||
boolean isTopLevelSource,
|
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
@Nullable TransferListener mediaTransferListener) {
|
||||||
super.prepareSourceInternal(player, isTopLevelSource, mediaTransferListener);
|
super.prepareSourceInternal(mediaTransferListener);
|
||||||
// We've queued a source info refresh on the playback thread's event queue. Allow the
|
// We've queued a source info refresh on the playback thread's event queue. Allow the
|
||||||
// test thread to prepare the player with the third source, and block this thread (the
|
// test thread to prepare the player with the third source, and block this thread (the
|
||||||
// playback thread) until the test thread's call to prepare() has returned.
|
// playback thread) until the test thread's call to prepare() has returned.
|
||||||
|
@ -22,7 +22,6 @@ import android.support.annotation.Nullable;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.ExoPlayer;
|
|
||||||
import com.google.android.exoplayer2.ExoPlayerLibraryInfo;
|
import com.google.android.exoplayer2.ExoPlayerLibraryInfo;
|
||||||
import com.google.android.exoplayer2.ParserException;
|
import com.google.android.exoplayer2.ParserException;
|
||||||
import com.google.android.exoplayer2.Timeline;
|
import com.google.android.exoplayer2.Timeline;
|
||||||
@ -614,10 +613,7 @@ public final class DashMediaSource extends BaseMediaSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void prepareSourceInternal(
|
public void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
|
||||||
ExoPlayer player,
|
|
||||||
boolean isTopLevelSource,
|
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
|
||||||
this.mediaTransferListener = mediaTransferListener;
|
this.mediaTransferListener = mediaTransferListener;
|
||||||
if (sideloadedManifest) {
|
if (sideloadedManifest) {
|
||||||
processManifest(false);
|
processManifest(false);
|
||||||
|
@ -19,7 +19,6 @@ import android.net.Uri;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.ExoPlayer;
|
|
||||||
import com.google.android.exoplayer2.ExoPlayerLibraryInfo;
|
import com.google.android.exoplayer2.ExoPlayerLibraryInfo;
|
||||||
import com.google.android.exoplayer2.extractor.Extractor;
|
import com.google.android.exoplayer2.extractor.Extractor;
|
||||||
import com.google.android.exoplayer2.source.BaseMediaSource;
|
import com.google.android.exoplayer2.source.BaseMediaSource;
|
||||||
@ -397,10 +396,7 @@ public final class HlsMediaSource extends BaseMediaSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void prepareSourceInternal(
|
public void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
|
||||||
ExoPlayer player,
|
|
||||||
boolean isTopLevelSource,
|
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
|
||||||
this.mediaTransferListener = mediaTransferListener;
|
this.mediaTransferListener = mediaTransferListener;
|
||||||
EventDispatcher eventDispatcher = createEventDispatcher(/* mediaPeriodId= */ null);
|
EventDispatcher eventDispatcher = createEventDispatcher(/* mediaPeriodId= */ null);
|
||||||
playlistTracker.start(manifestUri, eventDispatcher, /* listener= */ this);
|
playlistTracker.start(manifestUri, eventDispatcher, /* listener= */ this);
|
||||||
|
@ -20,7 +20,6 @@ import android.os.Handler;
|
|||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.ExoPlayer;
|
|
||||||
import com.google.android.exoplayer2.ExoPlayerLibraryInfo;
|
import com.google.android.exoplayer2.ExoPlayerLibraryInfo;
|
||||||
import com.google.android.exoplayer2.ParserException;
|
import com.google.android.exoplayer2.ParserException;
|
||||||
import com.google.android.exoplayer2.Timeline;
|
import com.google.android.exoplayer2.Timeline;
|
||||||
@ -510,10 +509,7 @@ public final class SsMediaSource extends BaseMediaSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void prepareSourceInternal(
|
public void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
|
||||||
ExoPlayer player,
|
|
||||||
boolean isTopLevelSource,
|
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
|
||||||
this.mediaTransferListener = mediaTransferListener;
|
this.mediaTransferListener = mediaTransferListener;
|
||||||
if (sideloadedManifest) {
|
if (sideloadedManifest) {
|
||||||
manifestLoaderErrorThrower = new LoaderErrorThrower.Dummy();
|
manifestLoaderErrorThrower = new LoaderErrorThrower.Dummy();
|
||||||
|
@ -22,7 +22,6 @@ import android.os.Handler;
|
|||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.ExoPlayer;
|
|
||||||
import com.google.android.exoplayer2.Format;
|
import com.google.android.exoplayer2.Format;
|
||||||
import com.google.android.exoplayer2.Timeline;
|
import com.google.android.exoplayer2.Timeline;
|
||||||
import com.google.android.exoplayer2.Timeline.Period;
|
import com.google.android.exoplayer2.Timeline.Period;
|
||||||
@ -96,10 +95,7 @@ public class FakeMediaSource extends BaseMediaSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void prepareSourceInternal(
|
public synchronized void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
|
||||||
ExoPlayer player,
|
|
||||||
boolean isTopLevelSource,
|
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
|
||||||
assertThat(preparedSource).isFalse();
|
assertThat(preparedSource).isFalse();
|
||||||
transferListener = mediaTransferListener;
|
transferListener = mediaTransferListener;
|
||||||
preparedSource = true;
|
preparedSource = true;
|
||||||
|
@ -17,17 +17,13 @@ package com.google.android.exoplayer2.testutil;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static com.google.common.truth.Truth.assertWithMessage;
|
import static com.google.common.truth.Truth.assertWithMessage;
|
||||||
import static org.junit.Assert.fail;
|
|
||||||
|
|
||||||
import android.os.ConditionVariable;
|
import android.os.ConditionVariable;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.Message;
|
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
import com.google.android.exoplayer2.ExoPlaybackException;
|
|
||||||
import com.google.android.exoplayer2.PlayerMessage;
|
|
||||||
import com.google.android.exoplayer2.Timeline;
|
import com.google.android.exoplayer2.Timeline;
|
||||||
import com.google.android.exoplayer2.source.MediaPeriod;
|
import com.google.android.exoplayer2.source.MediaPeriod;
|
||||||
import com.google.android.exoplayer2.source.MediaSource;
|
import com.google.android.exoplayer2.source.MediaSource;
|
||||||
@ -54,7 +50,6 @@ public class MediaSourceTestRunner {
|
|||||||
|
|
||||||
public static final int TIMEOUT_MS = 10000;
|
public static final int TIMEOUT_MS = 10000;
|
||||||
|
|
||||||
private final StubExoPlayer player;
|
|
||||||
private final MediaSource mediaSource;
|
private final MediaSource mediaSource;
|
||||||
private final MediaSourceListener mediaSourceListener;
|
private final MediaSourceListener mediaSourceListener;
|
||||||
private final HandlerThread playbackThread;
|
private final HandlerThread playbackThread;
|
||||||
@ -79,7 +74,6 @@ public class MediaSourceTestRunner {
|
|||||||
playbackThread.start();
|
playbackThread.start();
|
||||||
Looper playbackLooper = playbackThread.getLooper();
|
Looper playbackLooper = playbackThread.getLooper();
|
||||||
playbackHandler = new Handler(playbackLooper);
|
playbackHandler = new Handler(playbackLooper);
|
||||||
player = new EventHandlingExoPlayer(playbackLooper);
|
|
||||||
mediaSourceListener = new MediaSourceListener();
|
mediaSourceListener = new MediaSourceListener();
|
||||||
timelines = new LinkedBlockingDeque<>();
|
timelines = new LinkedBlockingDeque<>();
|
||||||
completedLoads = new CopyOnWriteArrayList<>();
|
completedLoads = new CopyOnWriteArrayList<>();
|
||||||
@ -121,11 +115,7 @@ public class MediaSourceTestRunner {
|
|||||||
final IOException[] prepareError = new IOException[1];
|
final IOException[] prepareError = new IOException[1];
|
||||||
runOnPlaybackThread(
|
runOnPlaybackThread(
|
||||||
() -> {
|
() -> {
|
||||||
mediaSource.prepareSource(
|
mediaSource.prepareSource(mediaSourceListener, /* mediaTransferListener= */ null);
|
||||||
player,
|
|
||||||
/* isTopLevelSource= */ true,
|
|
||||||
mediaSourceListener,
|
|
||||||
/* mediaTransferListener= */ null);
|
|
||||||
try {
|
try {
|
||||||
// TODO: This only catches errors that are set synchronously in prepareSource. To
|
// TODO: This only catches errors that are set synchronously in prepareSource. To
|
||||||
// capture async errors we'll need to poll maybeThrowSourceInfoRefreshError until the
|
// capture async errors we'll need to poll maybeThrowSourceInfoRefreshError until the
|
||||||
@ -430,43 +420,4 @@ public class MediaSourceTestRunner {
|
|||||||
Assertions.checkState(Looper.myLooper() == playbackThread.getLooper());
|
Assertions.checkState(Looper.myLooper() == playbackThread.getLooper());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class EventHandlingExoPlayer extends StubExoPlayer
|
|
||||||
implements Handler.Callback, PlayerMessage.Sender {
|
|
||||||
|
|
||||||
private final Handler handler;
|
|
||||||
|
|
||||||
public EventHandlingExoPlayer(Looper looper) {
|
|
||||||
this.handler = new Handler(looper, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Looper getApplicationLooper() {
|
|
||||||
return handler.getLooper();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PlayerMessage createMessage(PlayerMessage.Target target) {
|
|
||||||
return new PlayerMessage(
|
|
||||||
/* sender= */ this, target, Timeline.EMPTY, /* defaultWindowIndex= */ 0, handler);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void sendMessage(PlayerMessage message) {
|
|
||||||
handler.obtainMessage(0, message).sendToTarget();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public boolean handleMessage(Message msg) {
|
|
||||||
PlayerMessage message = (PlayerMessage) msg.obj;
|
|
||||||
try {
|
|
||||||
message.getTarget().handleMessage(message.getType(), message.getPayload());
|
|
||||||
message.markAsProcessed(/* isDelivered= */ true);
|
|
||||||
} catch (ExoPlaybackException e) {
|
|
||||||
fail("Unexpected ExoPlaybackException.");
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user