diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManager.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManager.java index ca4eb1fa0f..b2aca0f79b 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManager.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManager.java @@ -18,6 +18,7 @@ package androidx.media3.exoplayer.drm; import static androidx.media3.common.util.Assertions.checkArgument; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkState; +import static androidx.media3.common.util.Assertions.checkStateNotNull; import android.annotation.SuppressLint; import android.media.ResourceBusyException; @@ -37,6 +38,7 @@ import androidx.media3.common.PlaybackException; import androidx.media3.common.util.Log; import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; +import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.drm.DrmSession.DrmSessionException; import androidx.media3.exoplayer.drm.ExoMediaDrm.OnEventListener; import androidx.media3.exoplayer.upstream.DefaultLoadErrorHandlingPolicy; @@ -61,7 +63,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * A {@link DrmSessionManager} that supports playbacks using {@link ExoMediaDrm}. * *

This implementation supports pre-acquisition of sessions using {@link - * #preacquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)}. + * #preacquireSession(DrmSessionEventListener.EventDispatcher, Format)}. */ @RequiresApi(18) @UnstableApi @@ -422,8 +424,8 @@ public class DefaultDrmSessionManager implements DrmSessionManager { /** * Sets the mode, which determines the role of sessions acquired from the instance. This must be - * called before {@link #acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)} - * is called. + * called before {@link #acquireSession(DrmSessionEventListener.EventDispatcher, Format)} is + * called. * *

By default, the mode is {@link #MODE_PLAYBACK} and a streaming license is requested when * required. @@ -491,12 +493,15 @@ public class DefaultDrmSessionManager implements DrmSessionManager { } @Override - public DrmSessionReference preacquireSession( - Looper playbackLooper, - @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, - Format format) { - checkState(prepareCallsCount > 0); + public void setPlayer(Looper playbackLooper, PlayerId playerId) { initPlaybackLooper(playbackLooper); + } + + @Override + public DrmSessionReference preacquireSession( + @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, Format format) { + checkState(prepareCallsCount > 0); + checkStateNotNull(playbackLooper); PreacquiredSessionReference preacquiredSessionReference = new PreacquiredSessionReference(eventDispatcher); preacquiredSessionReference.acquire(format); @@ -506,11 +511,9 @@ public class DefaultDrmSessionManager implements DrmSessionManager { @Override @Nullable public DrmSession acquireSession( - Looper playbackLooper, - @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, - Format format) { + @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, Format format) { checkState(prepareCallsCount > 0); - initPlaybackLooper(playbackLooper); + checkStateNotNull(playbackLooper); return acquireSession( playbackLooper, eventDispatcher, @@ -980,7 +983,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager { * Constructs an instance. * * @param eventDispatcher The {@link DrmSessionEventListener.EventDispatcher} passed to {@link - * #acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)}. + * #acquireSession(DrmSessionEventListener.EventDispatcher, Format)}. */ public PreacquiredSessionReference( @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher) { diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmSessionManager.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmSessionManager.java index 95a9106170..a1b1bae06e 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmSessionManager.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmSessionManager.java @@ -21,6 +21,7 @@ import androidx.media3.common.C; import androidx.media3.common.Format; import androidx.media3.common.PlaybackException; import androidx.media3.common.util.UnstableApi; +import androidx.media3.exoplayer.analytics.PlayerId; /** Manages a DRM session. */ @UnstableApi @@ -47,12 +48,13 @@ public interface DrmSessionManager { DrmSessionManager DRM_UNSUPPORTED = new DrmSessionManager() { + @Override + public void setPlayer(Looper playbackLooper, PlayerId playerId) {} + @Override @Nullable public DrmSession acquireSession( - Looper playbackLooper, - @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, - Format format) { + @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, Format format) { if (format.drmInitData == null) { return null; } else { @@ -102,25 +104,33 @@ public interface DrmSessionManager { // Do nothing. } + /** + * Sets information about the player using this DRM session manager. + * + * @param playbackLooper The {@link Looper} associated with the player's playback thread. + * @param playerId The {@link PlayerId} of the player. + */ + void setPlayer(Looper playbackLooper, PlayerId playerId); + /** * Pre-acquires a DRM session for the specified {@link Format}. * - *

This notifies the manager that a subsequent call to {@link #acquireSession(Looper, + *

This notifies the manager that a subsequent call to {@link #acquireSession( * DrmSessionEventListener.EventDispatcher, Format)} with the same {@link Format} is likely, * allowing a manager that supports pre-acquisition to get the required {@link DrmSession} ready * in the background. * *

The caller must call {@link DrmSessionReference#release()} on the returned instance when * they no longer require the pre-acquisition (i.e. they know they won't be making a matching call - * to {@link #acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)} in the near + * to {@link #acquireSession(DrmSessionEventListener.EventDispatcher, Format)} in the near * future). * *

This manager may silently release the underlying session in order to allow another operation - * to complete. This will result in a subsequent call to {@link #acquireSession(Looper, + * to complete. This will result in a subsequent call to {@link #acquireSession( * DrmSessionEventListener.EventDispatcher, Format)} re-initializing a new session, including * repeating key loads and other async initialization steps. * - *

The caller must separately call {@link #acquireSession(Looper, + *

The caller must separately call {@link #acquireSession( * DrmSessionEventListener.EventDispatcher, Format)} in order to obtain a session suitable for * playback. The pre-acquired {@link DrmSessionReference} and full {@link DrmSession} instances * are distinct. The caller must release both, and can release the {@link DrmSessionReference} @@ -131,19 +141,15 @@ public interface DrmSessionManager { *

Implementations that do not support pre-acquisition always return an empty {@link * DrmSessionReference} instance. * - * @param playbackLooper The looper associated with the media playback thread. * @param eventDispatcher The {@link DrmSessionEventListener.EventDispatcher} used to distribute * events, and passed on to {@link * DrmSession#acquire(DrmSessionEventListener.EventDispatcher)}. * @param format The {@link Format} for which to pre-acquire a {@link DrmSession}. * @return A releaser for the pre-acquired session. Guaranteed to be non-null even if the matching - * {@link #acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)} would - * return null. + * {@link #acquireSession(DrmSessionEventListener.EventDispatcher, Format)} would return null. */ default DrmSessionReference preacquireSession( - Looper playbackLooper, - @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, - Format format) { + @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, Format format) { return DrmSessionReference.EMPTY; } @@ -160,7 +166,6 @@ public interface DrmSessionManager { * used to configure secure decoders for playback of clear content periods, which can reduce the * cost of transitioning between clear and encrypted content. * - * @param playbackLooper The looper associated with the media playback thread. * @param eventDispatcher The {@link DrmSessionEventListener.EventDispatcher} used to distribute * events, and passed on to {@link * DrmSession#acquire(DrmSessionEventListener.EventDispatcher)}. @@ -169,9 +174,7 @@ public interface DrmSessionManager { */ @Nullable DrmSession acquireSession( - Looper playbackLooper, - @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, - Format format); + @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, Format format); /** * Returns the {@link C.CryptoType} that the DRM session manager will use for a given {@link diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/OfflineLicenseHelper.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/OfflineLicenseHelper.java index 6f248b52db..cae26bbf4e 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/OfflineLicenseHelper.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/OfflineLicenseHelper.java @@ -27,6 +27,7 @@ import androidx.media3.common.Format; import androidx.media3.common.util.Assertions; import androidx.media3.common.util.UnstableApi; import androidx.media3.datasource.HttpDataSource; +import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.drm.DefaultDrmSessionManager.Mode; import androidx.media3.exoplayer.drm.DrmSession.DrmSessionException; import androidx.media3.exoplayer.source.MediaSource.MediaPeriodId; @@ -238,6 +239,7 @@ public final class OfflineLicenseHelper { public synchronized Pair getLicenseDurationRemainingSec(byte[] offlineLicenseKeySetId) throws DrmSessionException { Assertions.checkNotNull(offlineLicenseKeySetId); + drmSessionManager.setPlayer(handlerThread.getLooper(), PlayerId.UNSET); drmSessionManager.prepare(); DrmSession drmSession = openBlockingKeyRequest( @@ -266,6 +268,7 @@ public final class OfflineLicenseHelper { private byte[] blockingKeyRequest( @Mode int licenseMode, @Nullable byte[] offlineLicenseKeySetId, Format format) throws DrmSessionException { + drmSessionManager.setPlayer(handlerThread.getLooper(), PlayerId.UNSET); drmSessionManager.prepare(); DrmSession drmSession = openBlockingKeyRequest(licenseMode, offlineLicenseKeySetId, format); DrmSessionException error = drmSession.getError(); @@ -283,8 +286,7 @@ public final class OfflineLicenseHelper { Assertions.checkNotNull(format.drmInitData); drmSessionManager.setMode(licenseMode, offlineLicenseKeySetId); conditionVariable.close(); - DrmSession drmSession = - drmSessionManager.acquireSession(handlerThread.getLooper(), eventDispatcher, format); + DrmSession drmSession = drmSessionManager.acquireSession(eventDispatcher, format); // Block current thread until key loading is finished conditionVariable.block(); return Assertions.checkNotNull(drmSession); diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java index 95ab231af4..d98fcec67d 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java @@ -719,11 +719,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } } SampleQueue trackOutput = - SampleQueue.createWithDrm( - allocator, - /* playbackLooper= */ handler.getLooper(), - drmSessionManager, - drmEventDispatcher); + SampleQueue.createWithDrm(allocator, drmSessionManager, drmEventDispatcher); trackOutput.setUpstreamFormatChangeListener(this); @NullableType TrackId[] sampleQueueTrackIds = Arrays.copyOf(this.sampleQueueTrackIds, trackCount + 1); diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaSource.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaSource.java index 7965a19e16..2ceb4be8c8 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaSource.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaSource.java @@ -18,6 +18,7 @@ package androidx.media3.exoplayer.source; import static androidx.media3.common.util.Assertions.checkNotNull; import android.net.Uri; +import android.os.Looper; import androidx.annotation.Nullable; import androidx.media3.common.C; import androidx.media3.common.MediaItem; @@ -298,6 +299,8 @@ public final class ProgressiveMediaSource extends BaseMediaSource protected void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) { transferListener = mediaTransferListener; drmSessionManager.prepare(); + drmSessionManager.setPlayer( + /* playbackLooper= */ checkNotNull(Looper.myLooper()), getPlayerId()); notifySourceInfoRefreshed(); } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleQueue.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleQueue.java index 5f04a63755..aad102c1e2 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleQueue.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleQueue.java @@ -40,8 +40,10 @@ import androidx.media3.common.util.Util; import androidx.media3.decoder.DecoderInputBuffer; import androidx.media3.decoder.DecoderInputBuffer.InsufficientCapacityException; import androidx.media3.exoplayer.FormatHolder; +import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.drm.DrmSession; import androidx.media3.exoplayer.drm.DrmSessionEventListener; +import androidx.media3.exoplayer.drm.DrmSessionEventListener.EventDispatcher; import androidx.media3.exoplayer.drm.DrmSessionManager; import androidx.media3.exoplayer.drm.DrmSessionManager.DrmSessionReference; import androidx.media3.exoplayer.source.SampleStream.ReadFlags; @@ -73,7 +75,6 @@ public class SampleQueue implements TrackOutput { private final SpannedData sharedSampleMetadata; @Nullable private final DrmSessionManager drmSessionManager; @Nullable private final DrmSessionEventListener.EventDispatcher drmEventDispatcher; - @Nullable private final Looper playbackLooper; @Nullable private UpstreamFormatChangedListener upstreamFormatChangeListener; @Nullable private Format downstreamFormat; @@ -115,10 +116,7 @@ public class SampleQueue implements TrackOutput { */ public static SampleQueue createWithoutDrm(Allocator allocator) { return new SampleQueue( - allocator, - /* playbackLooper= */ null, - /* drmSessionManager= */ null, - /* drmEventDispatcher= */ null); + allocator, /* drmSessionManager= */ null, /* drmEventDispatcher= */ null); } /** @@ -128,7 +126,6 @@ public class SampleQueue implements TrackOutput { * keys needed to decrypt it. * * @param allocator An {@link Allocator} from which allocations for sample data can be obtained. - * @param playbackLooper The looper associated with the media playback thread. * @param drmSessionManager The {@link DrmSessionManager} to obtain {@link DrmSession DrmSessions} * from. The created instance does not take ownership of this {@link DrmSessionManager}. * @param drmEventDispatcher A {@link DrmSessionEventListener.EventDispatcher} to notify of events @@ -136,22 +133,36 @@ public class SampleQueue implements TrackOutput { */ public static SampleQueue createWithDrm( Allocator allocator, - Looper playbackLooper, DrmSessionManager drmSessionManager, DrmSessionEventListener.EventDispatcher drmEventDispatcher) { return new SampleQueue( allocator, - Assertions.checkNotNull(playbackLooper), + Assertions.checkNotNull(drmSessionManager), + Assertions.checkNotNull(drmEventDispatcher)); + } + + /** + * @deprecated Use {@link #createWithDrm(Allocator, DrmSessionManager, EventDispatcher)} instead. + * The {@code playbackLooper} should be configured on the {@link DrmSessionManager} with + * {@link DrmSessionManager#setPlayer(Looper, PlayerId)}. + */ + @Deprecated + public static SampleQueue createWithDrm( + Allocator allocator, + Looper playbackLooper, + DrmSessionManager drmSessionManager, + DrmSessionEventListener.EventDispatcher drmEventDispatcher) { + drmSessionManager.setPlayer(playbackLooper, PlayerId.UNSET); + return new SampleQueue( + allocator, Assertions.checkNotNull(drmSessionManager), Assertions.checkNotNull(drmEventDispatcher)); } protected SampleQueue( Allocator allocator, - @Nullable Looper playbackLooper, @Nullable DrmSessionManager drmSessionManager, @Nullable DrmSessionEventListener.EventDispatcher drmEventDispatcher) { - this.playbackLooper = playbackLooper; this.drmSessionManager = drmSessionManager; this.drmEventDispatcher = drmEventDispatcher; sampleDataQueue = new SampleDataQueue(allocator); @@ -805,8 +816,7 @@ public class SampleQueue implements TrackOutput { || !sharedSampleMetadata.getEndValue().format.equals(upstreamFormat)) { DrmSessionReference drmSessionReference = drmSessionManager != null - ? drmSessionManager.preacquireSession( - checkNotNull(playbackLooper), drmEventDispatcher, upstreamFormat) + ? drmSessionManager.preacquireSession(drmEventDispatcher, upstreamFormat) : DrmSessionReference.EMPTY; sharedSampleMetadata.appendSpan( @@ -915,9 +925,7 @@ public class SampleQueue implements TrackOutput { // Ensure we acquire the new session before releasing the previous one in case the same session // is being used for both DrmInitData. @Nullable DrmSession previousSession = currentDrmSession; - currentDrmSession = - drmSessionManager.acquireSession( - Assertions.checkNotNull(playbackLooper), drmEventDispatcher, newFormat); + currentDrmSession = drmSessionManager.acquireSession(drmEventDispatcher, newFormat); outputFormatHolder.drmSession = currentDrmSession; if (previousSession != null) { diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java index 4593b70f23..84a62381af 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java @@ -19,7 +19,6 @@ import static androidx.media3.common.util.Assertions.checkNotNull; import static java.lang.Math.max; import static java.lang.Math.min; -import android.os.Looper; import androidx.annotation.Nullable; import androidx.media3.common.C; import androidx.media3.common.Format; @@ -146,11 +145,7 @@ public class ChunkSampleStream SampleQueue[] sampleQueues = new SampleQueue[1 + embeddedTrackCount]; primarySampleQueue = - SampleQueue.createWithDrm( - allocator, - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - drmSessionManager, - drmEventDispatcher); + SampleQueue.createWithDrm(allocator, drmSessionManager, drmEventDispatcher); trackTypes[0] = primaryTrackType; sampleQueues[0] = primarySampleQueue; diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManagerTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManagerTest.java index 41eac806b6..3bd3545968 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManagerTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManagerTest.java @@ -27,6 +27,7 @@ import androidx.media3.common.DrmInitData; import androidx.media3.common.Format; import androidx.media3.common.MimeTypes; import androidx.media3.common.util.Util; +import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.drm.DrmSessionManager.DrmSessionReference; import androidx.media3.exoplayer.drm.ExoMediaDrm.AppManagedProvider; import androidx.media3.exoplayer.source.MediaSource; @@ -68,12 +69,11 @@ public class DefaultDrmSessionManagerTest { .setUuidAndExoMediaDrmProvider(DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm()) .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSession drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); waitForOpenedWithKeys(drmSession); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); @@ -92,12 +92,11 @@ public class DefaultDrmSessionManagerTest { .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSession drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); waitForOpenedWithKeys(drmSession); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); @@ -118,12 +117,11 @@ public class DefaultDrmSessionManagerTest { .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSession drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); waitForOpenedWithKeys(drmSession); drmSession.release(/* eventDispatcher= */ null); @@ -141,12 +139,11 @@ public class DefaultDrmSessionManagerTest { .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSession drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); waitForOpenedWithKeys(drmSession); drmSession.release(/* eventDispatcher= */ null); @@ -166,12 +163,11 @@ public class DefaultDrmSessionManagerTest { .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSession drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); waitForOpenedWithKeys(drmSession); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); @@ -193,12 +189,11 @@ public class DefaultDrmSessionManagerTest { .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSession drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); drmSessionManager.release(); // The manager is now in a 'releasing' state because the session is still active - so the @@ -239,12 +234,11 @@ public class DefaultDrmSessionManagerTest { .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSession drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); waitForOpenedWithKeys(drmSession); // Release the manager (there's still an explicit reference to the session from acquireSession). @@ -279,12 +273,11 @@ public class DefaultDrmSessionManagerTest { .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSession firstDrmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); waitForOpenedWithKeys(firstDrmSession); firstDrmSession.release(/* eventDispatcher= */ null); @@ -294,9 +287,7 @@ public class DefaultDrmSessionManagerTest { DrmSession secondDrmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - secondFormatWithDrmInitData)); + /* eventDispatcher= */ null, secondFormatWithDrmInitData)); // The drmSessionManager had to release firstDrmSession in order to acquire secondDrmSession. assertThat(firstDrmSession.getState()).isEqualTo(DrmSession.STATE_RELEASED); @@ -323,18 +314,15 @@ public class DefaultDrmSessionManagerTest { .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSessionReference firstDrmSessionReference = checkNotNull( drmSessionManager.preacquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); DrmSession firstDrmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); waitForOpenedWithKeys(firstDrmSession); firstDrmSession.release(/* eventDispatcher= */ null); @@ -344,9 +332,7 @@ public class DefaultDrmSessionManagerTest { DrmSession secondDrmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - secondFormatWithDrmInitData)); + /* eventDispatcher= */ null, secondFormatWithDrmInitData)); // The drmSessionManager had to release both it's internal keep-alive reference and the // reference represented by firstDrmSessionReference in order to acquire secondDrmSession. assertThat(firstDrmSession.getState()).isEqualTo(DrmSession.STATE_RELEASED); @@ -373,12 +359,11 @@ public class DefaultDrmSessionManagerTest { .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSession firstDrmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); waitForOpenedWithKeys(firstDrmSession); firstDrmSession.release(/* eventDispatcher= */ null); @@ -389,9 +374,7 @@ public class DefaultDrmSessionManagerTest { DrmSession secondDrmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); assertThat(secondDrmSession).isSameInstanceAs(firstDrmSession); // Let the timeout definitely expire, and check the session didn't get released. @@ -423,12 +406,10 @@ public class DefaultDrmSessionManagerTest { .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSessionReference sessionReference = - drmSessionManager.preacquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - eventDispatcher, - FORMAT_WITH_DRM_INIT_DATA); + drmSessionManager.preacquireSession(eventDispatcher, FORMAT_WITH_DRM_INIT_DATA); // Wait for the key load event to propagate, indicating the pre-acquired session is in // STATE_OPENED_WITH_KEYS. @@ -440,9 +421,7 @@ public class DefaultDrmSessionManagerTest { DrmSession drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); // Without idling the main/playback looper, we assert the session is already in OPENED_WITH_KEYS assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); @@ -472,12 +451,10 @@ public class DefaultDrmSessionManagerTest { .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSessionReference sessionReference = - drmSessionManager.preacquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA); + drmSessionManager.preacquireSession(/* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA); // Release the pre-acquired reference before the underlying session has had a chance to be // constructed. @@ -488,9 +465,7 @@ public class DefaultDrmSessionManagerTest { DrmSession drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED); waitForOpenedWithKeys(drmSession); @@ -512,12 +487,10 @@ public class DefaultDrmSessionManagerTest { .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSessionReference sessionReference = - drmSessionManager.preacquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA); + drmSessionManager.preacquireSession(/* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA); // Release the manager before the underlying session has had a chance to be constructed. This // will release all pre-acquired sessions. @@ -532,9 +505,7 @@ public class DefaultDrmSessionManagerTest { DrmSession drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED); waitForOpenedWithKeys(drmSession); @@ -560,14 +531,13 @@ public class DefaultDrmSessionManagerTest { .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DefaultDrmSession drmSession = (DefaultDrmSession) checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); waitForOpenedWithKeys(drmSession); assertThat(licenseServer.getReceivedSchemeDatas()).hasSize(1); @@ -602,14 +572,13 @@ public class DefaultDrmSessionManagerTest { .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DefaultDrmSession drmSession = (DefaultDrmSession) checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); waitForOpenedWithKeys(drmSession); assertThat(licenseServer.getReceivedSchemeDatas()).hasSize(1); @@ -647,12 +616,11 @@ public class DefaultDrmSessionManagerTest { uuid -> new FakeExoMediaDrm.Builder().setProvisionsRequired(1).build()) .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSession drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); // Confirm that opening the session threw NotProvisionedException (otherwise state would be // OPENED) assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENING); @@ -681,12 +649,11 @@ public class DefaultDrmSessionManagerTest { .build()) .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSession drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED); waitForOpenedWithKeys(drmSession); @@ -708,12 +675,11 @@ public class DefaultDrmSessionManagerTest { uuid -> new FakeExoMediaDrm.Builder().setProvisionsRequired(2).build()) .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSession drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); // Confirm that opening the session threw NotProvisionedException (otherwise state would be // OPENED) assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENING); @@ -737,12 +703,11 @@ public class DefaultDrmSessionManagerTest { DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm.Builder().build()) .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSession drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED); waitForOpenedWithKeys(drmSession); @@ -764,12 +729,11 @@ public class DefaultDrmSessionManagerTest { .setSessionKeepaliveMs(C.TIME_UNSET) .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSession drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); // Confirm that opening the session threw NotProvisionedException (otherwise state would be // OPENED) assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENING); @@ -781,9 +745,7 @@ public class DefaultDrmSessionManagerTest { drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); // Confirm that opening the session threw NotProvisionedException (otherwise state would be // OPENED) assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENING); @@ -804,16 +766,12 @@ public class DefaultDrmSessionManagerTest { Exception.class, () -> drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); assertThrows( Exception.class, () -> drmSessionManager.preacquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); } @Test @@ -826,12 +784,11 @@ public class DefaultDrmSessionManagerTest { .build(/* mediaDrmCallback= */ licenseServer); drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET); DrmSession drmSession = checkNotNull( drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); drmSessionManager.release(); // The manager's prepareCount is now zero, but the drmSession is keeping it in a 'releasing' @@ -840,16 +797,12 @@ public class DefaultDrmSessionManagerTest { Exception.class, () -> drmSessionManager.acquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); assertThrows( Exception.class, () -> drmSessionManager.preacquireSession( - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - /* eventDispatcher= */ null, - FORMAT_WITH_DRM_INIT_DATA)); + /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); drmSession.release(/* eventDispatcher= */ null); } diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/SampleQueueTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/SampleQueueTest.java index d301f4494d..b0ed736d5a 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/SampleQueueTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/SampleQueueTest.java @@ -36,10 +36,10 @@ import androidx.media3.common.DrmInitData; import androidx.media3.common.Format; import androidx.media3.common.MimeTypes; import androidx.media3.common.PlaybackException; -import androidx.media3.common.util.Assertions; import androidx.media3.common.util.ParsableByteArray; import androidx.media3.decoder.DecoderInputBuffer; import androidx.media3.exoplayer.FormatHolder; +import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.drm.DrmSession; import androidx.media3.exoplayer.drm.DrmSessionEventListener; import androidx.media3.exoplayer.drm.DrmSessionManager; @@ -146,12 +146,7 @@ public final class SampleQueueTest { mockDrmSession = Mockito.mock(DrmSession.class); mockDrmSessionManager = new MockDrmSessionManager(mockDrmSession); eventDispatcher = new DrmSessionEventListener.EventDispatcher(); - sampleQueue = - new SampleQueue( - allocator, - /* playbackLooper= */ Assertions.checkNotNull(Looper.myLooper()), - mockDrmSessionManager, - eventDispatcher); + sampleQueue = new SampleQueue(allocator, mockDrmSessionManager, eventDispatcher); formatHolder = new FormatHolder(); inputBuffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL); } @@ -424,12 +419,7 @@ public final class SampleQueueTest { public void isReadyReturnsTrueForClearSampleAndPlayClearSamplesWithoutKeysIsTrue() { when(mockDrmSession.playClearSamplesWithoutKeys()).thenReturn(true); // We recreate the queue to ensure the mock DRM session manager flags are taken into account. - sampleQueue = - new SampleQueue( - allocator, - /* playbackLooper= */ Assertions.checkNotNull(Looper.myLooper()), - mockDrmSessionManager, - eventDispatcher); + sampleQueue = new SampleQueue(allocator, mockDrmSessionManager, eventDispatcher); writeTestDataWithEncryptedSections(); assertThat(sampleQueue.isReady(/* loadingFinished= */ false)).isTrue(); } @@ -574,12 +564,7 @@ public final class SampleQueueTest { public void allowPlayClearSamplesWithoutKeysReadsClearSamples() { when(mockDrmSession.playClearSamplesWithoutKeys()).thenReturn(true); // We recreate the queue to ensure the mock DRM session manager flags are taken into account. - sampleQueue = - new SampleQueue( - allocator, - /* playbackLooper= */ Assertions.checkNotNull(Looper.myLooper()), - mockDrmSessionManager, - eventDispatcher); + sampleQueue = new SampleQueue(allocator, mockDrmSessionManager, eventDispatcher); when(mockDrmSession.getState()).thenReturn(DrmSession.STATE_OPENED); writeTestDataWithEncryptedSections(); @@ -1246,11 +1231,7 @@ public final class SampleQueueTest { public void adjustUpstreamFormat() { String label = "label"; sampleQueue = - new SampleQueue( - allocator, - /* playbackLooper= */ Assertions.checkNotNull(Looper.myLooper()), - mockDrmSessionManager, - eventDispatcher) { + new SampleQueue(allocator, mockDrmSessionManager, eventDispatcher) { @Override public Format getAdjustedUpstreamFormat(Format format) { return super.getAdjustedUpstreamFormat(copyWithLabel(format, label)); @@ -1266,11 +1247,7 @@ public final class SampleQueueTest { public void invalidateUpstreamFormatAdjustment() { AtomicReference label = new AtomicReference<>("label1"); sampleQueue = - new SampleQueue( - allocator, - /* playbackLooper= */ Assertions.checkNotNull(Looper.myLooper()), - mockDrmSessionManager, - eventDispatcher) { + new SampleQueue(allocator, mockDrmSessionManager, eventDispatcher) { @Override public Format getAdjustedUpstreamFormat(Format format) { return super.getAdjustedUpstreamFormat(copyWithLabel(format, label.get())); @@ -1770,12 +1747,13 @@ public final class SampleQueueTest { this.mockDrmSession = mockDrmSession; } + @Override + public void setPlayer(Looper playbackLooper, PlayerId playerId) {} + @Override @Nullable public DrmSession acquireSession( - Looper playbackLooper, - @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, - Format format) { + @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, Format format) { return format.drmInitData != null ? mockDrmSession : mockPlaceholderDrmSession; } diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java index 3cf5b51ade..aa23d56b79 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java @@ -22,6 +22,7 @@ import static java.lang.Math.min; import android.net.Uri; import android.os.Handler; +import android.os.Looper; import android.os.SystemClock; import android.text.TextUtils; import android.util.SparseArray; @@ -561,6 +562,7 @@ public final class DashMediaSource extends BaseMediaSource { protected void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) { this.mediaTransferListener = mediaTransferListener; drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), getPlayerId()); if (sideloadedManifest) { processManifest(false); } else { diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java index f76757a511..7549468ac7 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java @@ -19,6 +19,7 @@ import static androidx.media3.common.util.Assertions.checkNotNull; import static java.lang.annotation.RetentionPolicy.SOURCE; import android.net.Uri; +import android.os.Looper; import android.os.SystemClock; import androidx.annotation.IntDef; import androidx.annotation.Nullable; @@ -468,6 +469,8 @@ public final class HlsMediaSource extends BaseMediaSource protected void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) { this.mediaTransferListener = mediaTransferListener; drmSessionManager.prepare(); + drmSessionManager.setPlayer( + /* playbackLooper= */ checkNotNull(Looper.myLooper()), getPlayerId()); MediaSourceEventListener.EventDispatcher eventDispatcher = createEventDispatcher(/* mediaPeriodId= */ null); playlistTracker.start( diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java index 6ae634ebb8..ccc413b07a 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java @@ -23,7 +23,6 @@ import static java.lang.Math.min; import android.net.Uri; import android.os.Handler; -import android.os.Looper; import android.util.SparseIntArray; import androidx.annotation.Nullable; import androidx.media3.common.C; @@ -1100,12 +1099,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; boolean isAudioVideo = type == C.TRACK_TYPE_AUDIO || type == C.TRACK_TYPE_VIDEO; HlsSampleQueue sampleQueue = - new HlsSampleQueue( - allocator, - /* playbackLooper= */ handler.getLooper(), - drmSessionManager, - drmEventDispatcher, - overridingDrmInitData); + new HlsSampleQueue(allocator, drmSessionManager, drmEventDispatcher, overridingDrmInitData); sampleQueue.setStartTimeUs(lastSeekPositionUs); if (isAudioVideo) { sampleQueue.setDrmInitData(drmInitData); @@ -1639,11 +1633,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private HlsSampleQueue( Allocator allocator, - Looper playbackLooper, DrmSessionManager drmSessionManager, DrmSessionEventListener.EventDispatcher eventDispatcher, Map overridingDrmInitData) { - super(allocator, playbackLooper, drmSessionManager, eventDispatcher); + super(allocator, drmSessionManager, eventDispatcher); this.overridingDrmInitData = overridingDrmInitData; } diff --git a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java index df5588a6bb..909382622f 100644 --- a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java +++ b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java @@ -21,6 +21,7 @@ import static java.lang.Math.min; import android.net.Uri; import android.os.Handler; +import android.os.Looper; import android.os.SystemClock; import androidx.annotation.Nullable; import androidx.media3.common.C; @@ -438,6 +439,7 @@ public final class SsMediaSource extends BaseMediaSource protected void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) { this.mediaTransferListener = mediaTransferListener; drmSessionManager.prepare(); + drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), getPlayerId()); if (sideloadedManifest) { manifestLoaderErrorThrower = new LoaderErrorThrower.Dummy(); processManifest(); diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java index b52f7dc414..1779b3ef71 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java @@ -15,11 +15,13 @@ */ package androidx.media3.test.utils; +import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Util.castNonNull; import static com.google.common.truth.Truth.assertThat; import android.os.Handler; +import android.os.Looper; import android.os.SystemClock; import androidx.annotation.Nullable; import androidx.media3.common.C; @@ -214,6 +216,8 @@ public class FakeMediaSource extends BaseMediaSource { assertThat(preparedSource).isFalse(); transferListener = mediaTransferListener; drmSessionManager.prepare(); + drmSessionManager.setPlayer( + /* playbackLooper= */ checkNotNull(Looper.myLooper()), getPlayerId()); preparedSource = true; releasedSource = false; sourceInfoRefreshHandler = Util.createHandlerForCurrentLooper(); diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeSampleStream.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeSampleStream.java index d42ffaa12d..d072791b45 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeSampleStream.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeSampleStream.java @@ -17,7 +17,6 @@ package androidx.media3.test.utils; import static androidx.media3.common.util.Assertions.checkNotNull; -import android.os.Looper; import androidx.annotation.Nullable; import androidx.media3.common.C; import androidx.media3.common.Format; @@ -138,12 +137,7 @@ public class FakeSampleStream implements SampleStream { DrmSessionEventListener.EventDispatcher drmEventDispatcher, Format initialFormat, List fakeSampleStreamItems) { - this.sampleQueue = - SampleQueue.createWithDrm( - allocator, - /* playbackLooper= */ checkNotNull(Looper.myLooper()), - drmSessionManager, - drmEventDispatcher); + this.sampleQueue = SampleQueue.createWithDrm(allocator, drmSessionManager, drmEventDispatcher); this.mediaSourceEventDispatcher = mediaSourceEventDispatcher; this.sampleStreamItems = new ArrayList<>(); sampleStreamItems.add(FakeSampleStreamItem.format(initialFormat));