From 9508146840c68215fe6b71eea7045de8efdf3866 Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Fri, 30 Aug 2019 11:27:40 +0100 Subject: [PATCH] Introduce LoadErrorHandling policy in DefaultDrmSession This is a no-op interim change to introduce key request error handling customization. Following changes will allow users to inject their own LoadErrorHandlingPolicy implementations. Issue:#6334 PiperOrigin-RevId: 266344399 --- .../exoplayer2/drm/DefaultDrmSession.java | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java index c83214c8d5..6a65209841 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java @@ -28,10 +28,13 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; import com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest; import com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest; +import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy; +import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.EventDispatcher; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Util; +import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; @@ -47,6 +50,14 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; @TargetApi(18) public class DefaultDrmSession implements DrmSession { + /** Thrown when an unexpected exception or error is thrown during provisioning or key requests. */ + public static final class UnexpectedDrmSessionException extends IOException { + + public UnexpectedDrmSessionException(Throwable cause) { + super("Unexpected " + cause.getClass().getSimpleName() + ": " + cause.getMessage(), cause); + } + } + /** Manages provisioning requests. */ public interface ProvisioningManager { @@ -97,7 +108,7 @@ public class DefaultDrmSession implements DrmSession optionalKeyRequestParameters; private final EventDispatcher eventDispatcher; - private final int initialDrmRequestRetryCount; + private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; /* package */ final MediaDrmCallback callback; /* package */ final UUID uuid; @@ -164,8 +175,10 @@ public class DefaultDrmSession implements DrmSession implements DrmSession implements DrmSession initialDrmRequestRetryCount) { + if (errorCount > loadErrorHandlingPolicy.getMinimumLoadableRetryCount(C.DATA_TYPE_DRM)) { return false; } Message retryMsg = Message.obtain(originalMsg); retryMsg.arg2 = errorCount; - sendMessageDelayed(retryMsg, getRetryDelayMillis(errorCount)); - return true; - } - private long getRetryDelayMillis(int errorCount) { - return Math.min((errorCount - 1) * 1000, 5000); + IOException ioException = + e instanceof IOException ? (IOException) e : new UnexpectedDrmSessionException(e); + // TODO: Add loadDurationMs calculation before allowing user-provided load error handling + // policies. + long retryDelayMs = + loadErrorHandlingPolicy.getRetryDelayMsFor( + C.DATA_TYPE_DRM, /* loadDurationMs= */ C.TIME_UNSET, ioException, errorCount); + sendMessageDelayed(retryMsg, retryDelayMs); + return true; } } }