Commit 2f4a3d2e by tonihei Committed by Andrew Lewis

Replace ConcatenatingMediaSource with DynamicConcatenatingMediaSource.

The non-dynamic media source has a strict subset of features of the dynamic one and
thus can be replaced.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=187299432
parent 32b4db36
...@@ -4,10 +4,13 @@ ...@@ -4,10 +4,13 @@
* Downloading: Add `DownloadService`, `DownloadManager` and * Downloading: Add `DownloadService`, `DownloadManager` and
related classes ([#2643](https://github.com/google/ExoPlayer/issues/2643)). related classes ([#2643](https://github.com/google/ExoPlayer/issues/2643)).
* MediaSources: Allow reusing media sources after they have been released and * MediaSources:
* Allow reusing media sources after they have been released and
also in parallel to allow adding them multiple times to a concatenation. also in parallel to allow adding them multiple times to a concatenation.
([#3498](https://github.com/google/ExoPlayer/issues/3498)). ([#3498](https://github.com/google/ExoPlayer/issues/3498)).
* Allow clipping of child media sources where the period and window have a * Merged `DynamicConcatenatingMediaSource` into `ConcatenatingMediaSource` and
deprecated `DynamicConcatenatingMediaSource`.
* Allow clipping of child media sources where the period and window have a
non-zero offset with `ClippingMediaSource` non-zero offset with `ClippingMediaSource`
([#3888](https://github.com/google/ExoPlayer/issues/3888)). ([#3888](https://github.com/google/ExoPlayer/issues/3888)).
......
...@@ -31,7 +31,7 @@ import com.google.android.exoplayer2.Timeline; ...@@ -31,7 +31,7 @@ import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.Timeline.Period; import com.google.android.exoplayer2.Timeline.Period;
import com.google.android.exoplayer2.castdemo.DemoUtil.Sample; import com.google.android.exoplayer2.castdemo.DemoUtil.Sample;
import com.google.android.exoplayer2.ext.cast.CastPlayer; import com.google.android.exoplayer2.ext.cast.CastPlayer;
import com.google.android.exoplayer2.source.DynamicConcatenatingMediaSource; import com.google.android.exoplayer2.source.ConcatenatingMediaSource;
import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.source.dash.DashMediaSource;
...@@ -80,7 +80,7 @@ import java.util.ArrayList; ...@@ -80,7 +80,7 @@ import java.util.ArrayList;
private final ArrayList<DemoUtil.Sample> mediaQueue; private final ArrayList<DemoUtil.Sample> mediaQueue;
private final QueuePositionListener queuePositionListener; private final QueuePositionListener queuePositionListener;
private DynamicConcatenatingMediaSource dynamicConcatenatingMediaSource; private ConcatenatingMediaSource concatenatingMediaSource;
private boolean castMediaQueueCreationPending; private boolean castMediaQueueCreationPending;
private int currentItemIndex; private int currentItemIndex;
private Player currentPlayer; private Player currentPlayer;
...@@ -155,7 +155,7 @@ import java.util.ArrayList; ...@@ -155,7 +155,7 @@ import java.util.ArrayList;
public void addItem(Sample sample) { public void addItem(Sample sample) {
mediaQueue.add(sample); mediaQueue.add(sample);
if (currentPlayer == exoPlayer) { if (currentPlayer == exoPlayer) {
dynamicConcatenatingMediaSource.addMediaSource(buildMediaSource(sample)); concatenatingMediaSource.addMediaSource(buildMediaSource(sample));
} else { } else {
castPlayer.addItems(buildMediaQueueItem(sample)); castPlayer.addItems(buildMediaQueueItem(sample));
} }
...@@ -186,7 +186,7 @@ import java.util.ArrayList; ...@@ -186,7 +186,7 @@ import java.util.ArrayList;
*/ */
public boolean removeItem(int itemIndex) { public boolean removeItem(int itemIndex) {
if (currentPlayer == exoPlayer) { if (currentPlayer == exoPlayer) {
dynamicConcatenatingMediaSource.removeMediaSource(itemIndex); concatenatingMediaSource.removeMediaSource(itemIndex);
} else { } else {
if (castPlayer.getPlaybackState() != Player.STATE_IDLE) { if (castPlayer.getPlaybackState() != Player.STATE_IDLE) {
Timeline castTimeline = castPlayer.getCurrentTimeline(); Timeline castTimeline = castPlayer.getCurrentTimeline();
...@@ -215,7 +215,7 @@ import java.util.ArrayList; ...@@ -215,7 +215,7 @@ import java.util.ArrayList;
public boolean moveItem(int fromIndex, int toIndex) { public boolean moveItem(int fromIndex, int toIndex) {
// Player update. // Player update.
if (currentPlayer == exoPlayer) { if (currentPlayer == exoPlayer) {
dynamicConcatenatingMediaSource.moveMediaSource(fromIndex, toIndex); concatenatingMediaSource.moveMediaSource(fromIndex, toIndex);
} else if (castPlayer.getPlaybackState() != Player.STATE_IDLE) { } else if (castPlayer.getPlaybackState() != Player.STATE_IDLE) {
Timeline castTimeline = castPlayer.getCurrentTimeline(); Timeline castTimeline = castPlayer.getCurrentTimeline();
int periodCount = castTimeline.getPeriodCount(); int periodCount = castTimeline.getPeriodCount();
...@@ -349,11 +349,11 @@ import java.util.ArrayList; ...@@ -349,11 +349,11 @@ import java.util.ArrayList;
// Media queue management. // Media queue management.
castMediaQueueCreationPending = currentPlayer == castPlayer; castMediaQueueCreationPending = currentPlayer == castPlayer;
if (currentPlayer == exoPlayer) { if (currentPlayer == exoPlayer) {
dynamicConcatenatingMediaSource = new DynamicConcatenatingMediaSource(); concatenatingMediaSource = new ConcatenatingMediaSource();
for (int i = 0; i < mediaQueue.size(); i++) { for (int i = 0; i < mediaQueue.size(); i++) {
dynamicConcatenatingMediaSource.addMediaSource(buildMediaSource(mediaQueue.get(i))); concatenatingMediaSource.addMediaSource(buildMediaSource(mediaQueue.get(i)));
} }
exoPlayer.prepare(dynamicConcatenatingMediaSource); exoPlayer.prepare(concatenatingMediaSource);
} }
// Playback transition. // Playback transition.
......
...@@ -25,21 +25,21 @@ import android.support.v4.media.session.MediaControllerCompat; ...@@ -25,21 +25,21 @@ import android.support.v4.media.session.MediaControllerCompat;
import android.support.v4.media.session.MediaSessionCompat; import android.support.v4.media.session.MediaSessionCompat;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.source.DynamicConcatenatingMediaSource; import com.google.android.exoplayer2.source.ConcatenatingMediaSource;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import java.util.List; import java.util.List;
/** /**
* A {@link MediaSessionConnector.QueueEditor} implementation based on the * A {@link MediaSessionConnector.QueueEditor} implementation based on the {@link
* {@link DynamicConcatenatingMediaSource}. * ConcatenatingMediaSource}.
* <p> *
* This class implements the {@link MediaSessionConnector.CommandReceiver} interface and handles * <p>This class implements the {@link MediaSessionConnector.CommandReceiver} interface and handles
* the {@link #COMMAND_MOVE_QUEUE_ITEM} to move a queue item instead of removing and inserting it. * the {@link #COMMAND_MOVE_QUEUE_ITEM} to move a queue item instead of removing and inserting it.
* This allows to move the currently playing window without interrupting playback. * This allows to move the currently playing window without interrupting playback.
*/ */
public final class TimelineQueueEditor implements MediaSessionConnector.QueueEditor, public final class TimelineQueueEditor
MediaSessionConnector.CommandReceiver { implements MediaSessionConnector.QueueEditor, MediaSessionConnector.CommandReceiver {
public static final String COMMAND_MOVE_QUEUE_ITEM = "exo_move_window"; public static final String COMMAND_MOVE_QUEUE_ITEM = "exo_move_window";
public static final String EXTRA_FROM_INDEX = "from_index"; public static final String EXTRA_FROM_INDEX = "from_index";
...@@ -125,20 +125,21 @@ public final class TimelineQueueEditor implements MediaSessionConnector.QueueEdi ...@@ -125,20 +125,21 @@ public final class TimelineQueueEditor implements MediaSessionConnector.QueueEdi
private final QueueDataAdapter queueDataAdapter; private final QueueDataAdapter queueDataAdapter;
private final MediaSourceFactory sourceFactory; private final MediaSourceFactory sourceFactory;
private final MediaDescriptionEqualityChecker equalityChecker; private final MediaDescriptionEqualityChecker equalityChecker;
private final DynamicConcatenatingMediaSource queueMediaSource; private final ConcatenatingMediaSource queueMediaSource;
/** /**
* Creates a new {@link TimelineQueueEditor} with a given mediaSourceFactory. * Creates a new {@link TimelineQueueEditor} with a given mediaSourceFactory.
* *
* @param mediaController A {@link MediaControllerCompat} to read the current queue. * @param mediaController A {@link MediaControllerCompat} to read the current queue.
* @param queueMediaSource The {@link DynamicConcatenatingMediaSource} to * @param queueMediaSource The {@link ConcatenatingMediaSource} to manipulate.
* manipulate.
* @param queueDataAdapter A {@link QueueDataAdapter} to change the backing data. * @param queueDataAdapter A {@link QueueDataAdapter} to change the backing data.
* @param sourceFactory The {@link MediaSourceFactory} to build media sources. * @param sourceFactory The {@link MediaSourceFactory} to build media sources.
*/ */
public TimelineQueueEditor(@NonNull MediaControllerCompat mediaController, public TimelineQueueEditor(
@NonNull DynamicConcatenatingMediaSource queueMediaSource, @NonNull MediaControllerCompat mediaController,
@NonNull QueueDataAdapter queueDataAdapter, @NonNull MediaSourceFactory sourceFactory) { @NonNull ConcatenatingMediaSource queueMediaSource,
@NonNull QueueDataAdapter queueDataAdapter,
@NonNull MediaSourceFactory sourceFactory) {
this(mediaController, queueMediaSource, queueDataAdapter, sourceFactory, this(mediaController, queueMediaSource, queueDataAdapter, sourceFactory,
new MediaIdEqualityChecker()); new MediaIdEqualityChecker());
} }
...@@ -147,15 +148,16 @@ public final class TimelineQueueEditor implements MediaSessionConnector.QueueEdi ...@@ -147,15 +148,16 @@ public final class TimelineQueueEditor implements MediaSessionConnector.QueueEdi
* Creates a new {@link TimelineQueueEditor} with a given mediaSourceFactory. * Creates a new {@link TimelineQueueEditor} with a given mediaSourceFactory.
* *
* @param mediaController A {@link MediaControllerCompat} to read the current queue. * @param mediaController A {@link MediaControllerCompat} to read the current queue.
* @param queueMediaSource The {@link DynamicConcatenatingMediaSource} to * @param queueMediaSource The {@link ConcatenatingMediaSource} to manipulate.
* manipulate.
* @param queueDataAdapter A {@link QueueDataAdapter} to change the backing data. * @param queueDataAdapter A {@link QueueDataAdapter} to change the backing data.
* @param sourceFactory The {@link MediaSourceFactory} to build media sources. * @param sourceFactory The {@link MediaSourceFactory} to build media sources.
* @param equalityChecker The {@link MediaDescriptionEqualityChecker} to match queue items. * @param equalityChecker The {@link MediaDescriptionEqualityChecker} to match queue items.
*/ */
public TimelineQueueEditor(@NonNull MediaControllerCompat mediaController, public TimelineQueueEditor(
@NonNull DynamicConcatenatingMediaSource queueMediaSource, @NonNull MediaControllerCompat mediaController,
@NonNull QueueDataAdapter queueDataAdapter, @NonNull MediaSourceFactory sourceFactory, @NonNull ConcatenatingMediaSource queueMediaSource,
@NonNull QueueDataAdapter queueDataAdapter,
@NonNull MediaSourceFactory sourceFactory,
@NonNull MediaDescriptionEqualityChecker equalityChecker) { @NonNull MediaDescriptionEqualityChecker equalityChecker) {
this.mediaController = mediaController; this.mediaController = mediaController;
this.queueMediaSource = queueMediaSource; this.queueMediaSource = queueMediaSource;
......
...@@ -21,7 +21,6 @@ import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer; ...@@ -21,7 +21,6 @@ import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer;
import com.google.android.exoplayer2.metadata.MetadataRenderer; import com.google.android.exoplayer2.metadata.MetadataRenderer;
import com.google.android.exoplayer2.source.ClippingMediaSource; import com.google.android.exoplayer2.source.ClippingMediaSource;
import com.google.android.exoplayer2.source.ConcatenatingMediaSource; import com.google.android.exoplayer2.source.ConcatenatingMediaSource;
import com.google.android.exoplayer2.source.DynamicConcatenatingMediaSource;
import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.LoopingMediaSource; import com.google.android.exoplayer2.source.LoopingMediaSource;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
...@@ -54,8 +53,7 @@ import com.google.android.exoplayer2.video.MediaCodecVideoRenderer; ...@@ -54,8 +53,7 @@ import com.google.android.exoplayer2.video.MediaCodecVideoRenderer;
* implementation for loading single media samples ({@link SingleSampleMediaSource}) that's * implementation for loading single media samples ({@link SingleSampleMediaSource}) that's
* most often used for side-loaded subtitle files, and implementations for building more * most often used for side-loaded subtitle files, and implementations for building more
* complex MediaSources from simpler ones ({@link MergingMediaSource}, {@link * complex MediaSources from simpler ones ({@link MergingMediaSource}, {@link
* ConcatenatingMediaSource}, {@link DynamicConcatenatingMediaSource}, {@link * ConcatenatingMediaSource}, {@link LoopingMediaSource} and {@link ClippingMediaSource}).
* LoopingMediaSource} and {@link ClippingMediaSource}).
* <li><b>{@link Renderer}</b>s that render individual components of the media. The library * <li><b>{@link Renderer}</b>s that render individual components of the media. The library
* provides default implementations for common media types ({@link MediaCodecVideoRenderer}, * provides default implementations for common media types ({@link MediaCodecVideoRenderer},
* {@link MediaCodecAudioRenderer}, {@link TextRenderer} and {@link MetadataRenderer}). A * {@link MediaCodecAudioRenderer}, {@link TextRenderer} and {@link MetadataRenderer}). A
......
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