Commit 64829a03 by aquilescanta Committed by Toni

Calculate loadDurationMs in DefaultDrmSession key and provisioning requests

PiperOrigin-RevId: 266812110
parent 52edbaa9
...@@ -22,6 +22,7 @@ import android.os.Handler; ...@@ -22,6 +22,7 @@ import android.os.Handler;
import android.os.HandlerThread; import android.os.HandlerThread;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.os.SystemClock;
import android.util.Pair; import android.util.Pair;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
...@@ -112,12 +113,12 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T ...@@ -112,12 +113,12 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
/* package */ final MediaDrmCallback callback; /* package */ final MediaDrmCallback callback;
/* package */ final UUID uuid; /* package */ final UUID uuid;
/* package */ final PostResponseHandler postResponseHandler; /* package */ final ResponseHandler responseHandler;
private @DrmSession.State int state; private @DrmSession.State int state;
private int referenceCount; private int referenceCount;
@Nullable private HandlerThread requestHandlerThread; @Nullable private HandlerThread requestHandlerThread;
@Nullable private PostRequestHandler postRequestHandler; @Nullable private RequestHandler requestHandler;
@Nullable private T mediaCrypto; @Nullable private T mediaCrypto;
@Nullable private DrmSessionException lastException; @Nullable private DrmSessionException lastException;
private byte @NullableType [] sessionId; private byte @NullableType [] sessionId;
...@@ -180,7 +181,7 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T ...@@ -180,7 +181,7 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
new DefaultLoadErrorHandlingPolicy( new DefaultLoadErrorHandlingPolicy(
/* minimumLoadableRetryCount= */ initialDrmRequestRetryCount); /* minimumLoadableRetryCount= */ initialDrmRequestRetryCount);
state = STATE_OPENING; state = STATE_OPENING;
postResponseHandler = new PostResponseHandler(playbackLooper); responseHandler = new ResponseHandler(playbackLooper);
} }
public boolean hasSessionId(byte[] sessionId) { public boolean hasSessionId(byte[] sessionId) {
...@@ -201,7 +202,7 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T ...@@ -201,7 +202,7 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
public void provision() { public void provision() {
currentProvisionRequest = mediaDrm.getProvisionRequest(); currentProvisionRequest = mediaDrm.getProvisionRequest();
Util.castNonNull(postRequestHandler) Util.castNonNull(requestHandler)
.post( .post(
MSG_PROVISION, MSG_PROVISION,
Assertions.checkNotNull(currentProvisionRequest), Assertions.checkNotNull(currentProvisionRequest),
...@@ -254,7 +255,7 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T ...@@ -254,7 +255,7 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
Assertions.checkState(state == STATE_OPENING); Assertions.checkState(state == STATE_OPENING);
requestHandlerThread = new HandlerThread("DrmRequestHandler"); requestHandlerThread = new HandlerThread("DrmRequestHandler");
requestHandlerThread.start(); requestHandlerThread.start();
postRequestHandler = new PostRequestHandler(requestHandlerThread.getLooper()); requestHandler = new RequestHandler(requestHandlerThread.getLooper());
if (openInternal(true)) { if (openInternal(true)) {
doLicense(true); doLicense(true);
} }
...@@ -266,9 +267,9 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T ...@@ -266,9 +267,9 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
if (--referenceCount == 0) { if (--referenceCount == 0) {
// Assigning null to various non-null variables for clean-up. // Assigning null to various non-null variables for clean-up.
state = STATE_RELEASED; state = STATE_RELEASED;
Util.castNonNull(postResponseHandler).removeCallbacksAndMessages(null); Util.castNonNull(responseHandler).removeCallbacksAndMessages(null);
Util.castNonNull(postRequestHandler).removeCallbacksAndMessages(null); Util.castNonNull(requestHandler).removeCallbacksAndMessages(null);
postRequestHandler = null; requestHandler = null;
Util.castNonNull(requestHandlerThread).quit(); Util.castNonNull(requestHandlerThread).quit();
requestHandlerThread = null; requestHandlerThread = null;
mediaCrypto = null; mediaCrypto = null;
...@@ -417,7 +418,7 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T ...@@ -417,7 +418,7 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
try { try {
currentKeyRequest = currentKeyRequest =
mediaDrm.getKeyRequest(scope, schemeDatas, type, optionalKeyRequestParameters); mediaDrm.getKeyRequest(scope, schemeDatas, type, optionalKeyRequestParameters);
Util.castNonNull(postRequestHandler) Util.castNonNull(requestHandler)
.post(MSG_KEYS, Assertions.checkNotNull(currentKeyRequest), allowRetry); .post(MSG_KEYS, Assertions.checkNotNull(currentKeyRequest), allowRetry);
} catch (Exception e) { } catch (Exception e) {
onKeysError(e); onKeysError(e);
...@@ -490,9 +491,9 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T ...@@ -490,9 +491,9 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
// Internal classes. // Internal classes.
@SuppressLint("HandlerLeak") @SuppressLint("HandlerLeak")
private class PostResponseHandler extends Handler { private class ResponseHandler extends Handler {
public PostResponseHandler(Looper looper) { public ResponseHandler(Looper looper) {
super(looper); super(looper);
} }
...@@ -516,29 +517,30 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T ...@@ -516,29 +517,30 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
} }
@SuppressLint("HandlerLeak") @SuppressLint("HandlerLeak")
private class PostRequestHandler extends Handler { private class RequestHandler extends Handler {
public PostRequestHandler(Looper backgroundLooper) { public RequestHandler(Looper backgroundLooper) {
super(backgroundLooper); super(backgroundLooper);
} }
void post(int what, Object request, boolean allowRetry) { void post(int what, Object request, boolean allowRetry) {
int allowRetryInt = allowRetry ? 1 : 0; RequestTask requestTask =
int errorCount = 0; new RequestTask(allowRetry, /* startTimeMs= */ SystemClock.elapsedRealtime(), request);
obtainMessage(what, allowRetryInt, errorCount, request).sendToTarget(); obtainMessage(what, requestTask).sendToTarget();
} }
@Override @Override
public void handleMessage(Message msg) { public void handleMessage(Message msg) {
Object request = msg.obj; RequestTask requestTask = (RequestTask) msg.obj;
Object response; Object response;
try { try {
switch (msg.what) { switch (msg.what) {
case MSG_PROVISION: case MSG_PROVISION:
response = callback.executeProvisionRequest(uuid, (ProvisionRequest) request); response =
callback.executeProvisionRequest(uuid, (ProvisionRequest) requestTask.request);
break; break;
case MSG_KEYS: case MSG_KEYS:
response = callback.executeKeyRequest(uuid, (KeyRequest) request); response = callback.executeKeyRequest(uuid, (KeyRequest) requestTask.request);
break; break;
default: default:
throw new RuntimeException(); throw new RuntimeException();
...@@ -549,30 +551,47 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T ...@@ -549,30 +551,47 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
} }
response = e; response = e;
} }
postResponseHandler.obtainMessage(msg.what, Pair.create(request, response)).sendToTarget(); responseHandler
.obtainMessage(msg.what, Pair.create(requestTask.request, response))
.sendToTarget();
} }
private boolean maybeRetryRequest(Message originalMsg, Exception e) { private boolean maybeRetryRequest(Message originalMsg, Exception e) {
boolean allowRetry = originalMsg.arg1 == 1; RequestTask requestTask = (RequestTask) originalMsg.obj;
if (!allowRetry) { if (!requestTask.allowRetry) {
return false; return false;
} }
int errorCount = originalMsg.arg2 + 1; requestTask.errorCount++;
if (errorCount > loadErrorHandlingPolicy.getMinimumLoadableRetryCount(C.DATA_TYPE_DRM)) { if (requestTask.errorCount
> loadErrorHandlingPolicy.getMinimumLoadableRetryCount(C.DATA_TYPE_DRM)) {
return false; return false;
} }
Message retryMsg = Message.obtain(originalMsg); Message retryMsg = Message.obtain(originalMsg);
retryMsg.arg2 = errorCount;
IOException ioException = IOException ioException =
e instanceof IOException ? (IOException) e : new UnexpectedDrmSessionException(e); e instanceof IOException ? (IOException) e : new UnexpectedDrmSessionException(e);
// TODO: Add loadDurationMs calculation before allowing user-provided load error handling
// policies.
long retryDelayMs = long retryDelayMs =
loadErrorHandlingPolicy.getRetryDelayMsFor( loadErrorHandlingPolicy.getRetryDelayMsFor(
C.DATA_TYPE_DRM, /* loadDurationMs= */ C.TIME_UNSET, ioException, errorCount); C.DATA_TYPE_DRM,
/* loadDurationMs= */ SystemClock.elapsedRealtime() - requestTask.startTimeMs,
ioException,
requestTask.errorCount);
sendMessageDelayed(retryMsg, retryDelayMs); sendMessageDelayed(retryMsg, retryDelayMs);
return true; return true;
} }
} }
private static final class RequestTask {
public final boolean allowRetry;
public final long startTimeMs;
public final Object request;
public int errorCount;
public RequestTask(boolean allowRetry, long startTimeMs, Object request) {
this.allowRetry = allowRetry;
this.startTimeMs = startTimeMs;
this.request = request;
}
}
} }
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