Commit 9d028b33 by ibaker Committed by Rohit Singh

Add warning logs if `DefaultDrmSessionManager` is used on wrong thread

Issue: google/ExoPlayer#11008
PiperOrigin-RevId: 520864579
(cherry picked from commit 1ac7f3cd)
parent b0ce51ac
......@@ -136,9 +136,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private final PlayerId playerId;
/* package */ final MediaDrmCallback callback;
/* package */ final UUID uuid;
/* package */ final ResponseHandler responseHandler;
private final MediaDrmCallback callback;
private final UUID uuid;
private final Looper playbackLooper;
private final ResponseHandler responseHandler;
private @DrmSession.State int state;
private int referenceCount;
......@@ -209,10 +210,12 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
this.loadErrorHandlingPolicy = loadErrorHandlingPolicy;
this.playerId = playerId;
state = STATE_OPENING;
this.playbackLooper = playbackLooper;
responseHandler = new ResponseHandler(playbackLooper);
}
public boolean hasSessionId(byte[] sessionId) {
verifyPlaybackThread();
return Arrays.equals(this.sessionId, sessionId);
}
......@@ -255,50 +258,59 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
@Override
public final @DrmSession.State int getState() {
verifyPlaybackThread();
return state;
}
@Override
public boolean playClearSamplesWithoutKeys() {
verifyPlaybackThread();
return playClearSamplesWithoutKeys;
}
@Override
@Nullable
public final DrmSessionException getError() {
verifyPlaybackThread();
return state == STATE_ERROR ? lastException : null;
}
@Override
public final UUID getSchemeUuid() {
verifyPlaybackThread();
return uuid;
}
@Override
@Nullable
public final CryptoConfig getCryptoConfig() {
verifyPlaybackThread();
return cryptoConfig;
}
@Override
@Nullable
public Map<String, String> queryKeyStatus() {
verifyPlaybackThread();
return sessionId == null ? null : mediaDrm.queryKeyStatus(sessionId);
}
@Override
@Nullable
public byte[] getOfflineLicenseKeySetId() {
verifyPlaybackThread();
return offlineLicenseKeySetId;
}
@Override
public boolean requiresSecureDecoder(String mimeType) {
verifyPlaybackThread();
return mediaDrm.requiresSecureDecoder(checkStateNotNull(sessionId), mimeType);
}
@Override
public void acquire(@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher) {
verifyPlaybackThread();
if (referenceCount < 0) {
Log.e(TAG, "Session reference count less than zero: " + referenceCount);
referenceCount = 0;
......@@ -326,6 +338,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
@Override
public void release(@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher) {
verifyPlaybackThread();
if (referenceCount <= 0) {
Log.e(TAG, "release() called on a session that's already fully released.");
return;
......@@ -561,6 +574,18 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
}
}
private void verifyPlaybackThread() {
if (Thread.currentThread() != playbackLooper.getThread()) {
Log.w(
TAG,
"DefaultDrmSession accessed on the wrong thread.\nCurrent thread: "
+ Thread.currentThread().getName()
+ "\nExpected thread: "
+ playbackLooper.getThread().getName(),
new IllegalStateException());
}
}
// Internal classes.
@SuppressLint("HandlerLeak")
......
......@@ -468,6 +468,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager {
@Override
public final void prepare() {
verifyPlaybackThread(/* allowBeforeSetPlayer= */ true);
if (prepareCallsCount++ != 0) {
return;
}
......@@ -484,6 +485,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager {
@Override
public final void release() {
verifyPlaybackThread(/* allowBeforeSetPlayer= */ true);
if (--prepareCallsCount != 0) {
return;
}
......@@ -510,6 +512,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager {
@Override
public DrmSessionReference preacquireSession(
@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, Format format) {
// Don't verify the playback thread, preacquireSession can be called from any thread.
checkState(prepareCallsCount > 0);
checkStateNotNull(playbackLooper);
PreacquiredSessionReference preacquiredSessionReference =
......@@ -522,6 +525,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager {
@Nullable
public DrmSession acquireSession(
@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, Format format) {
verifyPlaybackThread(/* allowBeforeSetPlayer= */ false);
checkState(prepareCallsCount > 0);
checkStateNotNull(playbackLooper);
return acquireSession(
......@@ -596,6 +600,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager {
@Override
public @C.CryptoType int getCryptoType(Format format) {
verifyPlaybackThread(/* allowBeforeSetPlayer= */ false);
@C.CryptoType int cryptoType = checkNotNull(exoMediaDrm).getCryptoType();
if (format.drmInitData == null) {
int trackType = MimeTypes.getTrackType(format.sampleMimeType);
......@@ -814,6 +819,23 @@ public class DefaultDrmSessionManager implements DrmSessionManager {
}
}
private void verifyPlaybackThread(boolean allowBeforeSetPlayer) {
if (allowBeforeSetPlayer && playbackLooper == null) {
Log.w(
TAG,
"DefaultDrmSessionManager accessed before setPlayer(), possibly on the wrong thread.",
new IllegalStateException());
} else if (Thread.currentThread() != checkNotNull(playbackLooper).getThread()) {
Log.w(
TAG,
"DefaultDrmSessionManager accessed on the wrong thread.\nCurrent thread: "
+ Thread.currentThread().getName()
+ "\nExpected thread: "
+ playbackLooper.getThread().getName(),
new IllegalStateException());
}
}
/**
* Extracts {@link SchemeData} instances suitable for the given DRM scheme {@link UUID}.
*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment