From ecb83f3b738db25f503153617ba9db7bb9dc5b4b Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 25 Feb 2025 07:41:28 -0800 Subject: [PATCH] Add missing call to `adjustUuid` in `FrameworkMediaDrm` Before API 27, the platform DRM components incorrectly expected `C.COMMON_PSSH_UUID` instead of `C.CLEARKEY_UUID` in order to perform ClearKey decryption. `FrameworkMediaDrm` is responsible for doing this adjustment on these API levels, but this call was missed when refactoring some DRM code in https://github.com/androidx/media/commit/c872af4bc00608be70b74a2f61078e5d65ed8322. This led to `MediaCodec$CryptoException: Operation not supported in this configuration` errors when doing ClearKey playback on devices with API < 27. This was because the earlier, clearer error from the `MediaCrypto` constructor was being swallowed and transformed to `requiresSecureDecoder = true` by the `catch` logic in `FrameworkMediaDrm.requiresSecureDecoder`. This change also makes the error handling in `FrameworkMediaDrm.requiresSecureDecoder` more robust by assuming `requiresSecure = false` for ClearKey (and true for all other DRM schemes), since we know that ClearKey never supports secure decoding. This will help avoid more ClearKey playback failures if we see other, unrelated, errors at this point. Issue: androidx/media#1732 #cherrypick PiperOrigin-RevId: 730882278 --- RELEASENOTES.md | 3 +++ .../androidx/media3/exoplayer/drm/FrameworkMediaDrm.java | 9 ++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 9622efb60a..3343f0262e 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -25,6 +25,9 @@ * Image: * DataSource: * DRM: + * Fix `MediaCodec$CryptoException: Operation not supported in this + configuration` error when playing ClearKey content on API < 27 devices + ([#1732](https://github.com/androidx/media/issues/1732)). * Effect: * Muxers: * `writeSampleData()` API now uses muxer specific `BufferInfo` class diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/FrameworkMediaDrm.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/FrameworkMediaDrm.java index 49786a7d9c..dae849a3d1 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/FrameworkMediaDrm.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/FrameworkMediaDrm.java @@ -298,11 +298,14 @@ public final class FrameworkMediaDrm implements ExoMediaDrm { } else { MediaCrypto mediaCrypto = null; try { - mediaCrypto = new MediaCrypto(uuid, sessionId); + mediaCrypto = new MediaCrypto(adjustUuid(uuid), sessionId); result = mediaCrypto.requiresSecureDecoderComponent(mimeType); } catch (MediaCryptoException e) { - // This shouldn't happen, but if it does then assume that a secure decoder may be required. - result = true; + // This shouldn't happen, but if it does then assume that most DRM schemes need a secure + // decoder but ClearKey doesn't (because ClearKey never uses secure decryption). Requesting + // a secure decoder when it's not supported leads to playback failures: + // https://github.com/androidx/media/issues/1732 + result = !uuid.equals(C.CLEARKEY_UUID); } finally { if (mediaCrypto != null) { mediaCrypto.release();