Update DefaultDrmSession load error handling

Issue:#7309
PiperOrigin-RevId: 311504497
This commit is contained in:
aquilescanta 2020-05-14 11:51:15 +01:00 committed by Oliver Woodman
parent 7b552d7786
commit 6abec07a07

View File

@ -29,7 +29,10 @@ import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; import com.google.android.exoplayer2.drm.DrmInitData.SchemeData;
import com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest; import com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest;
import com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest; import com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest;
import com.google.android.exoplayer2.source.LoadEventInfo;
import com.google.android.exoplayer2.source.MediaLoadData;
import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy;
import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.CopyOnWriteMultiset; import com.google.android.exoplayer2.util.CopyOnWriteMultiset;
import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Log;
@ -53,8 +56,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
/** Thrown when an unexpected exception or error is thrown during provisioning or key requests. */ /** Thrown when an unexpected exception or error is thrown during provisioning or key requests. */
public static final class UnexpectedDrmSessionException extends IOException { public static final class UnexpectedDrmSessionException extends IOException {
public UnexpectedDrmSessionException(Throwable cause) { public UnexpectedDrmSessionException(@Nullable Throwable cause) {
super("Unexpected " + cause.getClass().getSimpleName() + ": " + cause.getMessage(), cause); super(cause);
} }
} }
@ -552,7 +555,11 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
void post(int what, Object request, boolean allowRetry) { void post(int what, Object request, boolean allowRetry) {
RequestTask requestTask = RequestTask requestTask =
new RequestTask(allowRetry, /* startTimeMs= */ SystemClock.elapsedRealtime(), request); new RequestTask(
LoadEventInfo.getNewId(),
allowRetry,
/* startTimeMs= */ SystemClock.elapsedRealtime(),
request);
obtainMessage(what, requestTask).sendToTarget(); obtainMessage(what, requestTask).sendToTarget();
} }
@ -572,18 +579,22 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
default: default:
throw new RuntimeException(); throw new RuntimeException();
} }
} catch (Exception e) { } catch (MediaDrmCallbackException e) {
if (maybeRetryRequest(msg, e)) { if (maybeRetryRequest(msg, e)) {
return; return;
} }
response = e; response = e;
} catch (Exception e) {
Log.w(TAG, "Key/provisioning request produced an unexpected exception. Not retrying.", e);
response = e;
} }
loadErrorHandlingPolicy.onLoadTaskConcluded(requestTask.taskId);
responseHandler responseHandler
.obtainMessage(msg.what, Pair.create(requestTask.request, response)) .obtainMessage(msg.what, Pair.create(requestTask.request, response))
.sendToTarget(); .sendToTarget();
} }
private boolean maybeRetryRequest(Message originalMsg, Exception e) { private boolean maybeRetryRequest(Message originalMsg, MediaDrmCallbackException exception) {
RequestTask requestTask = (RequestTask) originalMsg.obj; RequestTask requestTask = (RequestTask) originalMsg.obj;
if (!requestTask.allowRetry) { if (!requestTask.allowRetry) {
return false; return false;
@ -593,14 +604,24 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
> loadErrorHandlingPolicy.getMinimumLoadableRetryCount(C.DATA_TYPE_DRM)) { > loadErrorHandlingPolicy.getMinimumLoadableRetryCount(C.DATA_TYPE_DRM)) {
return false; return false;
} }
IOException ioException = LoadEventInfo loadEventInfo =
e instanceof IOException ? (IOException) e : new UnexpectedDrmSessionException(e); new LoadEventInfo(
requestTask.taskId,
exception.dataSpec,
exception.uriAfterRedirects,
exception.responseHeaders,
SystemClock.elapsedRealtime(),
/* loadDurationMs= */ SystemClock.elapsedRealtime() - requestTask.startTimeMs,
exception.bytesLoaded);
MediaLoadData mediaLoadData = new MediaLoadData(C.DATA_TYPE_DRM);
IOException loadErrorCause =
exception.getCause() instanceof IOException
? (IOException) exception.getCause()
: new UnexpectedDrmSessionException(exception.getCause());
long retryDelayMs = long retryDelayMs =
loadErrorHandlingPolicy.getRetryDelayMsFor( loadErrorHandlingPolicy.getRetryDelayMsFor(
C.DATA_TYPE_DRM, new LoadErrorInfo(
/* loadDurationMs= */ SystemClock.elapsedRealtime() - requestTask.startTimeMs, loadEventInfo, mediaLoadData, loadErrorCause, requestTask.errorCount));
ioException,
requestTask.errorCount);
if (retryDelayMs == C.TIME_UNSET) { if (retryDelayMs == C.TIME_UNSET) {
// The error is fatal. // The error is fatal.
return false; return false;
@ -612,12 +633,14 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
private static final class RequestTask { private static final class RequestTask {
public final long taskId;
public final boolean allowRetry; public final boolean allowRetry;
public final long startTimeMs; public final long startTimeMs;
public final Object request; public final Object request;
public int errorCount; public int errorCount;
public RequestTask(boolean allowRetry, long startTimeMs, Object request) { public RequestTask(long taskId, boolean allowRetry, long startTimeMs, Object request) {
this.taskId = taskId;
this.allowRetry = allowRetry; this.allowRetry = allowRetry;
this.startTimeMs = startTimeMs; this.startTimeMs = startTimeMs;
this.request = request; this.request = request;