Commit 97fbbad6 by olly Committed by Oliver Woodman

Avoid unnecessary decoder instantiations on key rotation

Issue: #6903
PiperOrigin-RevId: 292884280
parent 719b34a9
...@@ -1337,7 +1337,9 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -1337,7 +1337,9 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
if ((sourceDrmSession == null && codecDrmSession != null) if ((sourceDrmSession == null && codecDrmSession != null)
|| (sourceDrmSession != null && codecDrmSession == null) || (sourceDrmSession != null && codecDrmSession == null)
|| (sourceDrmSession != null && !codecInfo.secure) || (sourceDrmSession != null
&& !codecInfo.secure
&& maybeRequiresSecureDecoder(sourceDrmSession, newFormat))
|| (Util.SDK_INT < 23 && sourceDrmSession != codecDrmSession)) { || (Util.SDK_INT < 23 && sourceDrmSession != codecDrmSession)) {
// We might need to switch between the clear and protected output paths, or we're using DRM // We might need to switch between the clear and protected output paths, or we're using DRM
// prior to API level 23 where the codec needs to be re-initialized to switch to the new DRM // prior to API level 23 where the codec needs to be re-initialized to switch to the new DRM
...@@ -1794,9 +1796,22 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -1794,9 +1796,22 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
maybeInitCodec(); maybeInitCodec();
} }
private boolean isDecodeOnlyBuffer(long presentationTimeUs) {
// We avoid using decodeOnlyPresentationTimestamps.remove(presentationTimeUs) because it would
// box presentationTimeUs, creating a Long object that would need to be garbage collected.
int size = decodeOnlyPresentationTimestamps.size();
for (int i = 0; i < size; i++) {
if (decodeOnlyPresentationTimestamps.get(i) == presentationTimeUs) {
decodeOnlyPresentationTimestamps.remove(i);
return true;
}
}
return false;
}
@RequiresApi(23) @RequiresApi(23)
private void updateDrmSessionOrReinitializeCodecV23() throws ExoPlaybackException { private void updateDrmSessionOrReinitializeCodecV23() throws ExoPlaybackException {
FrameworkMediaCrypto sessionMediaCrypto = sourceDrmSession.getMediaCrypto(); @Nullable FrameworkMediaCrypto sessionMediaCrypto = sourceDrmSession.getMediaCrypto();
if (sessionMediaCrypto == null) { if (sessionMediaCrypto == null) {
// We'd only expect this to happen if the CDM from which the pending session is obtained needs // We'd only expect this to happen if the CDM from which the pending session is obtained needs
// provisioning. This is unlikely to happen (it probably requires a switch from one DRM scheme // provisioning. This is unlikely to happen (it probably requires a switch from one DRM scheme
...@@ -1830,17 +1845,38 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -1830,17 +1845,38 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
codecDrainAction = DRAIN_ACTION_NONE; codecDrainAction = DRAIN_ACTION_NONE;
} }
private boolean isDecodeOnlyBuffer(long presentationTimeUs) { /**
// We avoid using decodeOnlyPresentationTimestamps.remove(presentationTimeUs) because it would * Returns whether a {@link DrmSession} may require a secure decoder for a given {@link Format}.
// box presentationTimeUs, creating a Long object that would need to be garbage collected. *
int size = decodeOnlyPresentationTimestamps.size(); * @param drmSession The {@link DrmSession}.
for (int i = 0; i < size; i++) { * @param format The {@link Format}.
if (decodeOnlyPresentationTimestamps.get(i) == presentationTimeUs) { * @return Whether a secure decoder may be required.
decodeOnlyPresentationTimestamps.remove(i); */
return true; private static boolean maybeRequiresSecureDecoder(
} DrmSession<FrameworkMediaCrypto> drmSession, Format format) {
@Nullable FrameworkMediaCrypto sessionMediaCrypto = drmSession.getMediaCrypto();
if (sessionMediaCrypto == null) {
// We'd only expect this to happen if the CDM from which the pending session is obtained needs
// provisioning. This is unlikely to happen (it probably requires a switch from one DRM scheme
// to another, where the new CDM hasn't been used before and needs provisioning). Assume that
// a secure decoder may be required.
return true;
}
if (sessionMediaCrypto.forceAllowInsecureDecoderComponents) {
return false;
}
MediaCrypto mediaCrypto;
try {
mediaCrypto = new MediaCrypto(sessionMediaCrypto.uuid, sessionMediaCrypto.sessionId);
} catch (MediaCryptoException e) {
// This shouldn't happen, but if it does then assume that a secure decoder may be required.
return true;
}
try {
return mediaCrypto.requiresSecureDecoderComponent(format.sampleMimeType);
} finally {
mediaCrypto.release();
} }
return false;
} }
private static MediaCodec.CryptoInfo getFrameworkCryptoInfo( private static MediaCodec.CryptoInfo getFrameworkCryptoInfo(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment