Move DrmSessionManager initial player setup to its own method.
Currently, DrmSessionManager takes player specific values (= the playback looper) through (pre)acquireSession calls and requires the caller to pass in the same values every time. Instead, we can configure the DrmSessionManager for playback with a player once before it's being used. We can't simply extend the prepare() method as prepare may be called before the player is created to prewarm the DrmSessionManager. The new method also takes a PlayerId which is bound to the lifetime of the player similar to the playback looper. To avoid breakage of custom MediaSources with DRM, we can keep the old the SampleQueue.createWithDrm method as deprecated. PiperOrigin-RevId: 410998240
This commit is contained in:
parent
00a13a5159
commit
9af85d9b25
@ -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}.
|
||||
*
|
||||
* <p>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.
|
||||
*
|
||||
* <p>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) {
|
||||
|
@ -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}.
|
||||
*
|
||||
* <p>This notifies the manager that a subsequent call to {@link #acquireSession(Looper,
|
||||
* <p>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.
|
||||
*
|
||||
* <p>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).
|
||||
*
|
||||
* <p>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.
|
||||
*
|
||||
* <p>The caller must separately call {@link #acquireSession(Looper,
|
||||
* <p>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 {
|
||||
* <p>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
|
||||
|
@ -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<Long, Long> 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);
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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> 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) {
|
||||
|
@ -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<T extends ChunkSource>
|
||||
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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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<String> 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;
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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(
|
||||
|
@ -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<String, DrmInitData> overridingDrmInitData) {
|
||||
super(allocator, playbackLooper, drmSessionManager, eventDispatcher);
|
||||
super(allocator, drmSessionManager, eventDispatcher);
|
||||
this.overridingDrmInitData = overridingDrmInitData;
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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<FakeSampleStreamItem> 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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user