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 {