From 0b86f8949865ed685ff1aad89962867b5629ee8d Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 18 Sep 2024 06:39:10 -0700 Subject: [PATCH] Guard `DrmSession.requiresSecureDecoder` calls with state checks This method is documented that it may only be called in `STATE_OPENED` or `STATE_OPENED_WITH_KEYS`. It's possible for it to be called in other states (like `STATE_ERROR`) without this guard. Previously this didn't cause issues, but since https://github.com/androidx/media/commit/9d62845c458d1f1ca59bb1b6ac340707b70d82a5 we assume that the `sessionId` is non-null in this method, which results in an `IllegalStateException` when the documented state restriction is ignored. PiperOrigin-RevId: 675969256 --- RELEASENOTES.md | 3 +++ .../media3/exoplayer/mediacodec/MediaCodecRenderer.java | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f5696fd91d..3743a2acd3 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -51,6 +51,9 @@ * Image: * DataSource: * DRM: + * Fix `IllegalStateException` from + `DefaultDrmSession.requiresSecureDecoder` after opening a DRM session + failed. This issue was introduced in `1.5.0-alpha01`. * Effect: * Muxers: * IMA extension: diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java index 85efb6c718..330e47adde 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java @@ -578,6 +578,8 @@ public abstract class MediaCodecRenderer extends BaseRenderer { try { boolean mediaCryptoRequiresSecureDecoder = codecDrmSession != null + && (codecDrmSession.getState() == DrmSession.STATE_OPENED + || codecDrmSession.getState() == DrmSession.STATE_OPENED_WITH_KEYS) && codecDrmSession.requiresSecureDecoder( checkStateNotNull(inputFormat.sampleMimeType)); maybeInitCodecWithFallback(mediaCrypto, mediaCryptoRequiresSecureDecoder); @@ -2292,9 +2294,12 @@ public abstract class MediaCodecRenderer extends BaseRenderer { } // Re-initialization is required if newSession might require switching to the secure output - // path. + // path. We assume newSession might require a secure decoder if it's not fully open yet. return !codecInfo.secure - && newSession.requiresSecureDecoder(checkNotNull(newFormat.sampleMimeType)); + && (newSession.getState() == DrmSession.STATE_OPENING + || ((newSession.getState() == DrmSession.STATE_OPENED + || newSession.getState() == DrmSession.STATE_OPENED_WITH_KEYS) + && newSession.requiresSecureDecoder(checkNotNull(newFormat.sampleMimeType)))); } private void reinitializeCodec() throws ExoPlaybackException {