From 658def413668947fba27fd92ffe6b1cd1a3a2ee7 Mon Sep 17 00:00:00 2001 From: tonihei Date: Wed, 10 Nov 2021 15:55:34 +0000 Subject: [PATCH] Plumb PlayerId to MediaSource. MediaSource can be reused with other Player instances after they have been released, so we need to set the PlayerId when preparing the source. Access can mostly be handled by the implementation in BaseMediaSource. PiperOrigin-RevId: 408878824 --- .../exoplayer2/ExoPlayerImplInternal.java | 3 +- .../android/exoplayer2/MediaSourceList.java | 9 +++-- .../android/exoplayer2/MetadataRetriever.java | 4 ++- .../exoplayer2/offline/DownloadHelper.java | 4 ++- .../exoplayer2/source/BaseMediaSource.java | 22 ++++++++++-- .../source/CompositeMediaSource.java | 2 +- .../exoplayer2/source/MediaSource.java | 25 +++++++++++--- .../ads/ServerSideInsertedAdsMediaSource.java | 2 +- .../exoplayer2/MediaPeriodQueueTest.java | 8 +++-- .../exoplayer2/MediaSourceListTest.java | 34 ++++++++++--------- .../source/ConcatenatingMediaSourceTest.java | 3 +- .../source/ads/AdsMediaSourceTest.java | 4 ++- .../ServerSideInsertedAdMediaSourceTest.java | 5 ++- .../source/dash/DashMediaSourceTest.java | 3 +- .../source/hls/HlsMediaSourceTest.java | 7 ++-- .../testutil/MediaSourceTestRunner.java | 4 ++- .../testutil/FakeMediaSourceFactoryTest.java | 4 ++- 17 files changed, 104 insertions(+), 39 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index 6c766045ea..ca1ae359f5 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -268,7 +268,8 @@ import java.util.concurrent.atomic.AtomicBoolean; Handler eventHandler = new Handler(applicationLooper); queue = new MediaPeriodQueue(analyticsCollector, eventHandler); - mediaSourceList = new MediaSourceList(/* listener= */ this, analyticsCollector, eventHandler); + mediaSourceList = + new MediaSourceList(/* listener= */ this, analyticsCollector, eventHandler, playerId); // Note: The documentation for Process.THREAD_PRIORITY_AUDIO that states "Applications can // not normally change to this priority" is incorrect. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/MediaSourceList.java b/library/core/src/main/java/com/google/android/exoplayer2/MediaSourceList.java index 6a7d298955..95da840f95 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/MediaSourceList.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/MediaSourceList.java @@ -21,6 +21,7 @@ import static java.lang.Math.min; import android.os.Handler; import androidx.annotation.Nullable; import com.google.android.exoplayer2.analytics.AnalyticsCollector; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.source.LoadEventInfo; @@ -70,6 +71,7 @@ import java.util.Set; private static final String TAG = "MediaSourceList"; + private final PlayerId playerId; private final List mediaSourceHolders; private final IdentityHashMap mediaSourceByMediaPeriod; private final Map mediaSourceByUid; @@ -93,11 +95,14 @@ import java.util.Set; * source events. * @param analyticsCollectorHandler The {@link Handler} to call {@link AnalyticsCollector} methods * on. + * @param playerId The {@link PlayerId} of the player using this list. */ public MediaSourceList( MediaSourceListInfoRefreshListener listener, @Nullable AnalyticsCollector analyticsCollector, - Handler analyticsCollectorHandler) { + Handler analyticsCollectorHandler, + PlayerId playerId) { + this.playerId = playerId; mediaSourceListInfoListener = listener; shuffleOrder = new DefaultShuffleOrder(0); mediaSourceByMediaPeriod = new IdentityHashMap<>(); @@ -440,7 +445,7 @@ import java.util.Set; childSources.put(holder, new MediaSourceAndListener(mediaSource, caller, eventListener)); mediaSource.addEventListener(Util.createHandlerForCurrentOrMainLooper(), eventListener); mediaSource.addDrmEventListener(Util.createHandlerForCurrentOrMainLooper(), eventListener); - mediaSource.prepareSource(caller, mediaTransferListener); + mediaSource.prepareSource(caller, mediaTransferListener, playerId); } private void maybeReleaseChildSource(MediaSourceHolder mediaSourceHolder) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/MetadataRetriever.java b/library/core/src/main/java/com/google/android/exoplayer2/MetadataRetriever.java index 4c48cd3141..a3e8081c14 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/MetadataRetriever.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/MetadataRetriever.java @@ -23,6 +23,7 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.Message; import androidx.annotation.VisibleForTesting; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.ExtractorsFactory; import com.google.android.exoplayer2.extractor.mp4.Mp4Extractor; @@ -140,7 +141,8 @@ public final class MetadataRetriever { case MESSAGE_PREPARE_SOURCE: MediaItem mediaItem = (MediaItem) msg.obj; mediaSource = mediaSourceFactory.createMediaSource(mediaItem); - mediaSource.prepareSource(mediaSourceCaller, /* mediaTransferListener= */ null); + mediaSource.prepareSource( + mediaSourceCaller, /* mediaTransferListener= */ null, PlayerId.UNSET); mediaSourceHandler.sendEmptyMessage(MESSAGE_CHECK_FOR_FAILURE); return true; case MESSAGE_CHECK_FOR_FAILURE: diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java index e9d6c5829a..575b71fa2f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java @@ -32,6 +32,7 @@ import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.extractor.ExtractorsFactory; @@ -956,7 +957,8 @@ public final class DownloadHelper { public boolean handleMessage(Message msg) { switch (msg.what) { case MESSAGE_PREPARE_SOURCE: - mediaSource.prepareSource(/* caller= */ this, /* mediaTransferListener= */ null); + mediaSource.prepareSource( + /* caller= */ this, /* mediaTransferListener= */ null, PlayerId.UNSET); mediaSourceHandler.sendEmptyMessage(MESSAGE_CHECK_FOR_FAILURE); return true; case MESSAGE_CHECK_FOR_FAILURE: diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/BaseMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/BaseMediaSource.java index 8b4cddd8f7..91b0aff28d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/BaseMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/BaseMediaSource.java @@ -15,10 +15,13 @@ */ package com.google.android.exoplayer2.source; +import static com.google.android.exoplayer2.util.Assertions.checkStateNotNull; + import android.os.Handler; import android.os.Looper; import androidx.annotation.Nullable; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; @@ -41,6 +44,7 @@ public abstract class BaseMediaSource implements MediaSource { @Nullable private Looper looper; @Nullable private Timeline timeline; + @Nullable private PlayerId playerId; public BaseMediaSource() { mediaSourceCallers = new ArrayList<>(/* initialCapacity= */ 1); @@ -51,7 +55,7 @@ public abstract class BaseMediaSource implements MediaSource { /** * Starts source preparation and enables the source, see {@link #prepareSource(MediaSourceCaller, - * TransferListener)}. This method is called at most once until the next call to {@link + * TransferListener, PlayerId)}. This method is called at most once until the next call to {@link * #releaseSourceInternal()}. * * @param mediaTransferListener The transfer listener which should be informed of any media data @@ -160,6 +164,16 @@ public abstract class BaseMediaSource implements MediaSource { return !enabledMediaSourceCallers.isEmpty(); } + /** + * Returns the {@link PlayerId} of the player using this media source. + * + *

Must only be used when the media source is {@link #prepareSourceInternal(TransferListener) + * prepared}. + */ + protected final PlayerId getPlayerId() { + return checkStateNotNull(playerId); + } + @Override public final void addEventListener(Handler handler, MediaSourceEventListener eventListener) { Assertions.checkNotNull(handler); @@ -186,9 +200,12 @@ public abstract class BaseMediaSource implements MediaSource { @Override public final void prepareSource( - MediaSourceCaller caller, @Nullable TransferListener mediaTransferListener) { + MediaSourceCaller caller, + @Nullable TransferListener mediaTransferListener, + PlayerId playerId) { Looper looper = Looper.myLooper(); Assertions.checkArgument(this.looper == null || this.looper == looper); + this.playerId = playerId; @Nullable Timeline timeline = this.timeline; mediaSourceCallers.add(caller); if (this.looper == null) { @@ -226,6 +243,7 @@ public abstract class BaseMediaSource implements MediaSource { if (mediaSourceCallers.isEmpty()) { looper = null; timeline = null; + playerId = null; enabledMediaSourceCallers.clear(); releaseSourceInternal(); } else { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java index a19504ed7d..b38a0832d4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java @@ -117,7 +117,7 @@ public abstract class CompositeMediaSource extends BaseMediaSource { childSources.put(id, new MediaSourceAndListener<>(mediaSource, caller, eventListener)); mediaSource.addEventListener(Assertions.checkNotNull(eventHandler), eventListener); mediaSource.addDrmEventListener(Assertions.checkNotNull(eventHandler), eventListener); - mediaSource.prepareSource(caller, mediaTransferListener); + mediaSource.prepareSource(caller, mediaTransferListener, getPlayerId()); if (!isEnabled()) { mediaSource.disable(caller); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java index fe039f9d16..fc9f38a530 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java @@ -20,6 +20,7 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.TransferListener; @@ -34,7 +35,7 @@ import java.io.IOException; * provide a new timeline whenever the structure of the media changes. The MediaSource * provides these timelines by calling {@link MediaSourceCaller#onSourceInfoRefreshed} on the * {@link MediaSourceCaller}s passed to {@link #prepareSource(MediaSourceCaller, - * TransferListener)}. + * TransferListener, PlayerId)}. *

  • To provide {@link MediaPeriod} instances for the periods in its timeline. MediaPeriods are * obtained by calling {@link #createPeriod(MediaPeriodId, Allocator, long)}, and provide a * way for the player to load and read the media. @@ -183,6 +184,16 @@ public interface MediaSource { /** Returns the {@link MediaItem} whose media is provided by the source. */ MediaItem getMediaItem(); + /** + * @deprecated Implement {@link #prepareSource(MediaSourceCaller, TransferListener, PlayerId)} + * instead. + */ + @Deprecated + default void prepareSource( + MediaSourceCaller caller, @Nullable TransferListener mediaTransferListener) { + prepareSource(caller, mediaTransferListener, PlayerId.UNSET); + } + /** * Registers a {@link MediaSourceCaller}. Starts source preparation if needed and enables the * source for the creation of {@link MediaPeriod MediaPerods}. @@ -200,15 +211,20 @@ public interface MediaSource { * transfers. May be null if no listener is available. Note that this listener should be only * informed of transfers related to the media loads and not of auxiliary loads for manifests * and other data. + * @param playerId The {@link PlayerId} of the player using this media source. */ - void prepareSource(MediaSourceCaller caller, @Nullable TransferListener mediaTransferListener); + void prepareSource( + MediaSourceCaller caller, + @Nullable TransferListener mediaTransferListener, + PlayerId playerId); /** * Throws any pending error encountered while loading or refreshing source information. * *

    Should not be called directly from application code. * - *

    Must only be called after {@link #prepareSource(MediaSourceCaller, TransferListener)}. + *

    Must only be called after {@link #prepareSource(MediaSourceCaller, TransferListener, + * PlayerId)}. */ void maybeThrowSourceInfoRefreshError() throws IOException; @@ -217,7 +233,8 @@ public interface MediaSource { * *

    Should not be called directly from application code. * - *

    Must only be called after {@link #prepareSource(MediaSourceCaller, TransferListener)}. + *

    Must only be called after {@link #prepareSource(MediaSourceCaller, TransferListener, + * PlayerId)}. * * @param caller The {@link MediaSourceCaller} enabling the source. */ diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsMediaSource.java index 1a5d94ad1f..3a14510b8b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsMediaSource.java @@ -168,7 +168,7 @@ public final class ServerSideInsertedAdsMediaSource extends BaseMediaSource } mediaSource.addEventListener(handler, /* eventListener= */ this); mediaSource.addDrmEventListener(handler, /* eventListener= */ this); - mediaSource.prepareSource(/* caller= */ this, mediaTransferListener); + mediaSource.prepareSource(/* caller= */ this, mediaTransferListener, getPlayerId()); } @Override diff --git a/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java b/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java index 53bc87e5e6..00e99f8b3a 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java @@ -23,7 +23,9 @@ import android.net.Uri; import android.os.Handler; import android.os.Looper; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; +import com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller; import com.google.android.exoplayer2.source.SinglePeriodTimeline; import com.google.android.exoplayer2.source.ads.AdPlaybackState; import com.google.android.exoplayer2.source.ads.SinglePeriodAdTimeline; @@ -78,7 +80,8 @@ public final class MediaPeriodQueueTest { new MediaSourceList( mock(MediaSourceList.MediaSourceListInfoRefreshListener.class), /* analyticsCollector= */ null, - new Handler(Looper.getMainLooper())); + new Handler(Looper.getMainLooper()), + PlayerId.UNSET); rendererCapabilities = new RendererCapabilities[0]; trackSelector = mock(TrackSelector.class); allocator = mock(Allocator.class); @@ -738,7 +741,8 @@ public final class MediaPeriodQueueTest { new MediaSourceList.MediaSourceHolder(fakeMediaSource, /* useLazyPreparation= */ false); mediaSourceList.setMediaSources( ImmutableList.of(mediaSourceHolder), new FakeShuffleOrder(/* length= */ 1)); - mediaSourceHolder.mediaSource.prepareSourceInternal(/* mediaTransferListener */ null); + mediaSourceHolder.mediaSource.prepareSource( + mock(MediaSourceCaller.class), /* mediaTransferListener */ null, PlayerId.UNSET); Timeline playlistTimeline = mediaSourceList.createTimeline(); firstPeriodUid = playlistTimeline.getUidOfPeriod(/* periodIndex= */ 0); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/MediaSourceListTest.java b/library/core/src/test/java/com/google/android/exoplayer2/MediaSourceListTest.java index ea40519a3c..209fb83547 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/MediaSourceListTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/MediaSourceListTest.java @@ -26,6 +26,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ShuffleOrder; import com.google.android.exoplayer2.testutil.FakeMediaSource; @@ -54,7 +55,8 @@ public class MediaSourceListTest { new MediaSourceList( mock(MediaSourceList.MediaSourceListInfoRefreshListener.class), /* analyticsCollector= */ null, - Util.createHandlerForCurrentOrMainLooper()); + Util.createHandlerForCurrentOrMainLooper(), + PlayerId.UNSET); } @Test @@ -92,30 +94,30 @@ public class MediaSourceListTest { // Verify prepare is called once on prepare. verify(mockMediaSource1, times(0)) .prepareSource( - any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull()); + any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull(), any()); verify(mockMediaSource2, times(0)) .prepareSource( - any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull()); + any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull(), any()); mediaSourceList.prepare(/* mediaTransferListener= */ null); assertThat(mediaSourceList.isPrepared()).isTrue(); // Verify prepare is called once on prepare. verify(mockMediaSource1, times(1)) .prepareSource( - any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull()); + any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull(), any()); verify(mockMediaSource2, times(1)) .prepareSource( - any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull()); + any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull(), any()); mediaSourceList.release(); mediaSourceList.prepare(/* mediaTransferListener= */ null); // Verify prepare is called a second time on re-prepare. verify(mockMediaSource1, times(2)) .prepareSource( - any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull()); + any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull(), any()); verify(mockMediaSource2, times(2)) .prepareSource( - any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull()); + any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull(), any()); } @Test @@ -182,10 +184,10 @@ public class MediaSourceListTest { // Verify sources are prepared. verify(mockMediaSource1, times(1)) .prepareSource( - any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull()); + any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull(), any()); verify(mockMediaSource2, times(1)) .prepareSource( - any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull()); + any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull(), any()); // Set media items again. The second holder is re-used. MediaSource mockMediaSource3 = mock(MediaSource.class); @@ -203,7 +205,7 @@ public class MediaSourceListTest { assertThat(mediaSources.get(1).isRemoved).isFalse(); verify(mockMediaSource2, times(2)) .prepareSource( - any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull()); + any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull(), any()); } @Test @@ -222,10 +224,10 @@ public class MediaSourceListTest { // Verify lazy initialization does not call prepare on sources. verify(mockMediaSource1, times(0)) .prepareSource( - any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull()); + any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull(), any()); verify(mockMediaSource2, times(0)) .prepareSource( - any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull()); + any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull(), any()); for (int i = 0; i < mediaSources.size(); i++) { assertThat(mediaSources.get(i).firstWindowIndexInChild).isEqualTo(i); @@ -259,10 +261,10 @@ public class MediaSourceListTest { // Verify prepare is called on sources when added. verify(mockMediaSource1, times(1)) .prepareSource( - any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull()); + any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull(), any()); verify(mockMediaSource2, times(1)) .prepareSource( - any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull()); + any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull(), any()); } @Test @@ -387,7 +389,7 @@ public class MediaSourceListTest { new ShuffleOrder.DefaultShuffleOrder(/* length= */ 1)); verify(mockMediaSource, times(0)) .prepareSource( - any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull()); + any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull(), any()); mediaSourceList.release(); verify(mockMediaSource, times(0)).releaseSource(any(MediaSource.MediaSourceCaller.class)); assertThat(mediaSourceHolder.isRemoved).isFalse(); @@ -406,7 +408,7 @@ public class MediaSourceListTest { new ShuffleOrder.DefaultShuffleOrder(/* length= */ 1)); verify(mockMediaSource, times(1)) .prepareSource( - any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull()); + any(MediaSource.MediaSourceCaller.class), /* mediaTransferListener= */ isNull(), any()); mediaSourceList.release(); verify(mockMediaSource, times(1)).releaseSource(any(MediaSource.MediaSourceCaller.class)); assertThat(mediaSourceHolder.isRemoved).isFalse(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/ConcatenatingMediaSourceTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/ConcatenatingMediaSourceTest.java index f34ab81e0f..b78a7c4e0f 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/ConcatenatingMediaSourceTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/ConcatenatingMediaSourceTest.java @@ -24,6 +24,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller; import com.google.android.exoplayer2.source.ShuffleOrder.DefaultShuffleOrder; @@ -644,7 +645,7 @@ public final class ConcatenatingMediaSourceTest { () -> { MediaSourceCaller caller = mock(MediaSourceCaller.class); mediaSource.addMediaSources(Arrays.asList(createMediaSources(2))); - mediaSource.prepareSource(caller, /* mediaTransferListener= */ null); + mediaSource.prepareSource(caller, /* mediaTransferListener= */ null, PlayerId.UNSET); mediaSource.moveMediaSource( /* currentIndex= */ 0, /* newIndex= */ 1, diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/ads/AdsMediaSourceTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/ads/AdsMediaSourceTest.java index 1580a39f17..5e69dfc755 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/ads/AdsMediaSourceTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/ads/AdsMediaSourceTest.java @@ -29,6 +29,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller; @@ -117,7 +118,8 @@ public final class AdsMediaSourceTest { adMediaSourceFactory, mockAdsLoader, mockAdViewProvider); - adsMediaSource.prepareSource(mockMediaSourceCaller, /* mediaTransferListener= */ null); + adsMediaSource.prepareSource( + mockMediaSourceCaller, /* mediaTransferListener= */ null, PlayerId.UNSET); shadowOf(Looper.getMainLooper()).idle(); verify(mockAdsLoader) .start( diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java index 6b1f858f96..3c0dba79b6 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java @@ -40,6 +40,7 @@ import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.analytics.AnalyticsListener; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.robolectric.PlaybackOutput; import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; @@ -104,7 +105,9 @@ public final class ServerSideInsertedAdMediaSourceTest { mediaSource.setAdPlaybackState(adPlaybackState); mediaSource.prepareSource( - (source, timeline) -> timelineReference.set(timeline), /* mediaTransferListener= */ null); + (source, timeline) -> timelineReference.set(timeline), + /* mediaTransferListener= */ null, + PlayerId.UNSET); runMainLooperUntil(() -> timelineReference.get() != null); Timeline timeline = timelineReference.get(); diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java index 004b7e22c7..de6045f8e6 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java @@ -27,6 +27,7 @@ import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline.Window; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller; @@ -484,7 +485,7 @@ public final class DashMediaSourceTest { countDownLatch.countDown(); } }; - mediaSource.prepareSource(caller, /* mediaTransferListener= */ null); + mediaSource.prepareSource(caller, /* mediaTransferListener= */ null, PlayerId.UNSET); while (!countDownLatch.await(/* timeout= */ 10, MILLISECONDS)) { ShadowLooper.idleMainLooper(); } diff --git a/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaSourceTest.java b/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaSourceTest.java index 556bb83bb9..6e1e298184 100644 --- a/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaSourceTest.java +++ b/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaSourceTest.java @@ -25,6 +25,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist; @@ -752,7 +753,7 @@ public class HlsMediaSourceTest { List timelines = new ArrayList<>(); MediaSource.MediaSourceCaller mediaSourceCaller = (source, timeline) -> timelines.add(timeline); - mediaSource.prepareSource(mediaSourceCaller, null); + mediaSource.prepareSource(mediaSourceCaller, /* mediaTransferListener= */ null, PlayerId.UNSET); runMainLooperUntil(() -> timelines.size() == 1); mediaSource.onPrimaryPlaylistRefreshed(secondPlaylist); runMainLooperUntil(() -> timelines.size() == 2); @@ -785,7 +786,9 @@ public class HlsMediaSourceTest { throws TimeoutException { AtomicReference receivedTimeline = new AtomicReference<>(); mediaSource.prepareSource( - (source, timeline) -> receivedTimeline.set(timeline), /* mediaTransferListener= */ null); + (source, timeline) -> receivedTimeline.set(timeline), + /* mediaTransferListener= */ null, + PlayerId.UNSET); runMainLooperUntil(() -> receivedTimeline.get() != null); return receivedTimeline.get(); } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/MediaSourceTestRunner.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/MediaSourceTestRunner.java index 3bb4e0562d..747957feb1 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/MediaSourceTestRunner.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/MediaSourceTestRunner.java @@ -26,6 +26,7 @@ import android.os.Looper; import android.util.Pair; import androidx.annotation.Nullable; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.source.LoadEventInfo; import com.google.android.exoplayer2.source.MediaLoadData; import com.google.android.exoplayer2.source.MediaPeriod; @@ -115,7 +116,8 @@ public class MediaSourceTestRunner { final IOException[] prepareError = new IOException[1]; runOnPlaybackThread( () -> { - mediaSource.prepareSource(mediaSourceListener, /* mediaTransferListener= */ null); + mediaSource.prepareSource( + mediaSourceListener, /* mediaTransferListener= */ null, PlayerId.UNSET); try { // TODO: This only catches errors that are set synchronously in prepareSource. To // capture async errors we'll need to poll maybeThrowSourceInfoRefreshError until the diff --git a/testutils/src/test/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactoryTest.java b/testutils/src/test/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactoryTest.java index c9f9a5a7b6..ac2c41ccf7 100644 --- a/testutils/src/test/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactoryTest.java +++ b/testutils/src/test/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactoryTest.java @@ -21,6 +21,7 @@ import androidx.annotation.Nullable; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Timeline.Window; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.source.MediaSource; import java.util.concurrent.atomic.AtomicReference; import org.junit.Test; @@ -42,7 +43,8 @@ public class FakeMediaSourceFactoryTest { int firstWindowIndex = timeline.getFirstWindowIndex(/* shuffleModeEnabled= */ false); reportedMediaItem.set(timeline.getWindow(firstWindowIndex, new Window()).mediaItem); }, - /* mediaTransferListener= */ null); + /* mediaTransferListener= */ null, + PlayerId.UNSET); assertThat(reportedMediaItem.get()).isSameInstanceAs(mediaItem); assertThat(mediaSource.getMediaItem()).isSameInstanceAs(mediaItem);