Commit 8d329fb4 by aquilescanta Committed by Toni

Move DefaultDrmSession resource acquisition to acquire

PiperOrigin-RevId: 249624318
parent 2f12374f
...@@ -74,7 +74,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -74,7 +74,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
public interface ReleaseCallback<T extends ExoMediaCrypto> { public interface ReleaseCallback<T extends ExoMediaCrypto> {
/** /**
* Called when the session is released. * Called immediately after releasing session resources.
* *
* @param session The session. * @param session The session.
*/ */
...@@ -85,7 +85,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -85,7 +85,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
private static final int MSG_PROVISION = 0; private static final int MSG_PROVISION = 0;
private static final int MSG_KEYS = 1; private static final int MSG_KEYS = 1;
private static final int MAX_LICENSE_DURATION_TO_RENEW = 60; private static final int MAX_LICENSE_DURATION_TO_RENEW_SECONDS = 60;
/** The DRM scheme datas, or null if this session uses offline keys. */ /** The DRM scheme datas, or null if this session uses offline keys. */
public final @Nullable List<SchemeData> schemeDatas; public final @Nullable List<SchemeData> schemeDatas;
...@@ -104,10 +104,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -104,10 +104,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
private @DrmSession.State int state; private @DrmSession.State int state;
private int openCount; private int openCount;
private HandlerThread requestHandlerThread; @Nullable private HandlerThread requestHandlerThread;
private PostRequestHandler postRequestHandler; @Nullable private PostRequestHandler postRequestHandler;
private @Nullable T mediaCrypto; @Nullable private T mediaCrypto;
private @Nullable DrmSessionException lastException; @Nullable private DrmSessionException lastException;
private byte @MonotonicNonNull [] sessionId; private byte @MonotonicNonNull [] sessionId;
private byte @MonotonicNonNull [] offlineLicenseKeySetId; private byte @MonotonicNonNull [] offlineLicenseKeySetId;
...@@ -166,35 +166,31 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -166,35 +166,31 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
this.initialDrmRequestRetryCount = initialDrmRequestRetryCount; this.initialDrmRequestRetryCount = initialDrmRequestRetryCount;
this.eventDispatcher = eventDispatcher; this.eventDispatcher = eventDispatcher;
state = STATE_OPENING; state = STATE_OPENING;
postResponseHandler = new PostResponseHandler(playbackLooper); postResponseHandler = new PostResponseHandler(playbackLooper);
requestHandlerThread = new HandlerThread("DrmRequestHandler");
requestHandlerThread.start();
postRequestHandler = new PostRequestHandler(requestHandlerThread.getLooper());
} }
// Life cycle. // Life cycle.
public void acquire() { public void acquire() {
if (++openCount == 1) { if (++openCount == 1) {
if (state == STATE_ERROR) { requestHandlerThread = new HandlerThread("DrmRequestHandler");
return; requestHandlerThread.start();
} postRequestHandler = new PostRequestHandler(requestHandlerThread.getLooper());
if (openInternal(true)) { if (openInternal(true)) {
doLicense(true); doLicense(true);
} }
} }
} }
// Assigning null to various non-null variables for clean-up. Class won't be used after release.
@SuppressWarnings("assignment.type.incompatible") @SuppressWarnings("assignment.type.incompatible")
public void release() { public void release() {
if (--openCount == 0) { if (--openCount == 0) {
// Assigning null to various non-null variables for clean-up.
state = STATE_RELEASED; state = STATE_RELEASED;
postResponseHandler.removeCallbacksAndMessages(null); postResponseHandler.removeCallbacksAndMessages(null);
postRequestHandler.removeCallbacksAndMessages(null); Util.castNonNull(postRequestHandler).removeCallbacksAndMessages(null);
postRequestHandler = null; postRequestHandler = null;
requestHandlerThread.quit(); Util.castNonNull(requestHandlerThread).quit();
requestHandlerThread = null; requestHandlerThread = null;
mediaCrypto = null; mediaCrypto = null;
lastException = null; lastException = null;
...@@ -227,7 +223,11 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -227,7 +223,11 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
public void provision() { public void provision() {
currentProvisionRequest = mediaDrm.getProvisionRequest(); currentProvisionRequest = mediaDrm.getProvisionRequest();
postRequestHandler.post(MSG_PROVISION, currentProvisionRequest, /* allowRetry= */ true); Util.castNonNull(postRequestHandler)
.post(
MSG_PROVISION,
Assertions.checkNotNull(currentProvisionRequest),
/* allowRetry= */ true);
} }
public void onProvisionCompleted() { public void onProvisionCompleted() {
...@@ -335,7 +335,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -335,7 +335,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
} else if (state == STATE_OPENED_WITH_KEYS || restoreKeys()) { } else if (state == STATE_OPENED_WITH_KEYS || restoreKeys()) {
long licenseDurationRemainingSec = getLicenseDurationRemainingSec(); long licenseDurationRemainingSec = getLicenseDurationRemainingSec();
if (mode == DefaultDrmSessionManager.MODE_PLAYBACK if (mode == DefaultDrmSessionManager.MODE_PLAYBACK
&& licenseDurationRemainingSec <= MAX_LICENSE_DURATION_TO_RENEW) { && licenseDurationRemainingSec <= MAX_LICENSE_DURATION_TO_RENEW_SECONDS) {
Log.d( Log.d(
TAG, TAG,
"Offline license has expired or will expire soon. " "Offline license has expired or will expire soon. "
...@@ -398,7 +398,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -398,7 +398,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
try { try {
currentKeyRequest = currentKeyRequest =
mediaDrm.getKeyRequest(scope, schemeDatas, type, optionalKeyRequestParameters); mediaDrm.getKeyRequest(scope, schemeDatas, type, optionalKeyRequestParameters);
postRequestHandler.post(MSG_KEYS, currentKeyRequest, allowRetry); Util.castNonNull(postRequestHandler)
.post(MSG_KEYS, Assertions.checkNotNull(currentKeyRequest), allowRetry);
} catch (Exception e) { } catch (Exception e) {
onKeysError(e); onKeysError(e);
} }
......
...@@ -17,6 +17,8 @@ package com.google.android.exoplayer2.drm; ...@@ -17,6 +17,8 @@ package com.google.android.exoplayer2.drm;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Matchers.any; import static org.mockito.Matchers.any;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
...@@ -25,6 +27,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; ...@@ -25,6 +27,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; import com.google.android.exoplayer2.drm.DrmInitData.SchemeData;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
...@@ -46,6 +49,10 @@ public class OfflineLicenseHelperTest { ...@@ -46,6 +49,10 @@ public class OfflineLicenseHelperTest {
public void setUp() throws Exception { public void setUp() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
when(mediaDrm.openSession()).thenReturn(new byte[] {1, 2, 3}); when(mediaDrm.openSession()).thenReturn(new byte[] {1, 2, 3});
when(mediaDrm.getKeyRequest(
nullable(byte[].class), nullable(List.class), anyInt(), nullable(HashMap.class)))
.thenReturn(
new ExoMediaDrm.KeyRequest(/* data= */ new byte[0], /* licenseServerUrl= */ ""));
offlineLicenseHelper = offlineLicenseHelper =
new OfflineLicenseHelper<>(C.WIDEVINE_UUID, mediaDrm, mediaDrmCallback, null); new OfflineLicenseHelper<>(C.WIDEVINE_UUID, mediaDrm, mediaDrmCallback, null);
} }
......
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