From 9d62845c458d1f1ca59bb1b6ac340707b70d82a5 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 14 Aug 2024 04:49:10 -0700 Subject: [PATCH] Pass explicit `securityLevel` into `MediaDrm.requiresSecureDecoder` Previous to this change, `FrameworkMediaDrm.requiresSecureDecoder` ignores its `sessionId` parameter on API 31+, and uses only the `mimeType` parameter. This means the result [assumes the session is opened at the 'default security level'](https://developer.android.com/reference/android/media/MediaDrm#requiresSecureDecoder(java.lang.String)): > The default security level is defined as the highest security level > supported on the device. This change is a no-op in all (?) cases, because the `ExoMediaDrm` interface only exposes the zero-arg `openSession()` method, which in the framework case **also** assumes the highest security level is preferred: > By default, sessions are opened at the native security level of the > device. However, it seems more obviously correct to only make this "highest/native security level" assumption in one place (`openSession()`), and check the session's **actual** security level everywhere else. Issue: androidx/media#1603 PiperOrigin-RevId: 662872860 --- .../androidx/media3/exoplayer/drm/FrameworkMediaDrm.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 8b35a5fc5be..44a847350d8 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 @@ -293,7 +293,8 @@ public Map queryKeyStatus(byte[] sessionId) { public boolean requiresSecureDecoder(byte[] sessionId, String mimeType) { boolean result; if (Util.SDK_INT >= 31 && isMediaDrmRequiresSecureDecoderImplemented()) { - result = Api31.requiresSecureDecoder(mediaDrm, mimeType); + result = + Api31.requiresSecureDecoder(mediaDrm, mimeType, mediaDrm.getSecurityLevel(sessionId)); } else { MediaCrypto mediaCrypto = null; try { @@ -591,8 +592,9 @@ private static class Api31 { private Api31() {} @DoNotInline - public static boolean requiresSecureDecoder(MediaDrm mediaDrm, String mimeType) { - return mediaDrm.requiresSecureDecoder(mimeType); + public static boolean requiresSecureDecoder( + MediaDrm mediaDrm, String mimeType, int securityLevel) { + return mediaDrm.requiresSecureDecoder(mimeType, securityLevel); } @DoNotInline