From d0e72141850d3c271fc26b488323cda5959fcfe2 Mon Sep 17 00:00:00 2001 From: Dean Wheatley Date: Fri, 26 Apr 2024 13:51:31 +1000 Subject: [PATCH] Do not flush eac3(joc) decoder on reuse eac3(joc) decoders do not need to be flushed to be reused for the next compatible track. This change allows for gapless playback on devices with Dolby decoders that require internal re-initialization on flush. --- .../media3/exoplayer/mediacodec/MediaCodecInfo.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecInfo.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecInfo.java index a4696e30d7e..9ae5e28847c 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecInfo.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecInfo.java @@ -479,6 +479,17 @@ public DecoderReuseEvaluation canReuseCodec(Format oldFormat, Format newFormat) } } + // For eac3 and eac3-joc formats, adaptation is possible without reconfiguration or flushing. + if (discardReasons == 0 && (MimeTypes.AUDIO_E_AC3_JOC.equals(mimeType) + || MimeTypes.AUDIO_E_AC3.equals(mimeType))) { + return new DecoderReuseEvaluation( + name, + oldFormat, + newFormat, + REUSE_RESULT_YES_WITHOUT_RECONFIGURATION, + /* discardReasons= */ 0); + } + if (!oldFormat.initializationDataEquals(newFormat)) { discardReasons |= DISCARD_REASON_INITIALIZATION_DATA_CHANGED; }