Update DefaultDrmSession load error handling
Issue:#7309 PiperOrigin-RevId: 311504497
This commit is contained in:
parent
7b552d7786
commit
6abec07a07
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user