diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java index 48002c7a86..b966492d8c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java @@ -369,6 +369,15 @@ public abstract class MediaCodecRenderer extends BaseRenderer { wrappedMediaCrypto = mediaCrypto.getWrappedMediaCrypto(); drmSessionRequiresSecureDecoder = mediaCrypto.requiresSecureDecoderComponent(mimeType); } + if (deviceNeedsDrmKeysToConfigureCodecWorkaround()) { + @DrmSession.State int drmSessionState = drmSession.getState(); + if (drmSessionState == DrmSession.STATE_ERROR) { + throw ExoPlaybackException.createForRenderer(drmSession.getError(), getIndex()); + } else if (drmSessionState != DrmSession.STATE_OPENED_WITH_KEYS) { + // Wait for keys. + return; + } + } } if (codecInfo == null) { @@ -1209,6 +1218,16 @@ public abstract class MediaCodecRenderer extends BaseRenderer { return false; } + /** + * Returns whether the device needs keys to have been loaded into the {@link DrmSession} before + * codec configuration. + */ + private boolean deviceNeedsDrmKeysToConfigureCodecWorkaround() { + return "Amazon".equals(Util.MANUFACTURER) + && ("AFTM".equals(Util.MODEL) // Fire TV Stick Gen 1 + || "AFTB".equals(Util.MODEL)); // Fire TV Gen 1 + } + /** * Returns whether the decoder is known to fail when flushed. *