diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 2263131204e..434f4f2c744 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -65,6 +65,8 @@ * Publish `testutils` module to simplify unit testing with ExoPlayer ([#6267](https://github.com/google/ExoPlayer/issues/6267)). * Add `uid` to `Timeline.Window` to uniquely identify window instances. +* Fix decoder selection for E-AC3 JOC streams + ([#6398](https://github.com/google/ExoPlayer/issues/6398)). ### 2.10.4 ### diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java index 251901f4f26..34f8363c78b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java @@ -46,6 +46,7 @@ import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; import java.nio.ByteBuffer; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -361,10 +362,11 @@ protected List getDecoderInfos( decoderInfos = MediaCodecUtil.getDecoderInfosSortedByFormatSupport(decoderInfos, format); if (MimeTypes.AUDIO_E_AC3_JOC.equals(format.sampleMimeType)) { // E-AC3 decoders can decode JOC streams, but in 2-D rather than 3-D. - List eac3DecoderInfos = + List decoderInfosWithEac3 = new ArrayList<>(decoderInfos); + decoderInfosWithEac3.addAll( mediaCodecSelector.getDecoderInfos( - MimeTypes.AUDIO_E_AC3, requiresSecureDecoder, /* requiresTunnelingDecoder= */ false); - decoderInfos.addAll(eac3DecoderInfos); + MimeTypes.AUDIO_E_AC3, requiresSecureDecoder, /* requiresTunnelingDecoder= */ false)); + decoderInfos = decoderInfosWithEac3; } return Collections.unmodifiableList(decoderInfos); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecSelector.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecSelector.java index a639cf9a1bd..10ff81147ea 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecSelector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecSelector.java @@ -52,7 +52,8 @@ public MediaCodecInfo getPassthroughDecoderInfo() throws DecoderQueryException { * @param mimeType The MIME type for which a decoder is required. * @param requiresSecureDecoder Whether a secure decoder is required. * @param requiresTunnelingDecoder Whether a tunneling decoder is required. - * @return A list of {@link MediaCodecInfo}s corresponding to decoders. May be empty. + * @return An unmodifiable list of {@link MediaCodecInfo}s corresponding to decoders. May be + * empty. * @throws DecoderQueryException Thrown if there was an error querying decoders. */ List getDecoderInfos( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java index eb97d546e5a..1293f14d08f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java @@ -156,8 +156,8 @@ public static MediaCodecInfo getDecoderInfo(String mimeType, boolean secure, boo * unless secure decryption really is required. * @param tunneling Whether the decoder is required to support tunneling. Always pass false unless * tunneling really is required. - * @return A list of all {@link MediaCodecInfo}s for the given mime type, in the order given by - * {@link MediaCodecList}. + * @return An unmodifiable list of all {@link MediaCodecInfo}s for the given mime type, in the + * order given by {@link MediaCodecList}. * @throws DecoderQueryException If there was an error querying the available decoders. */ public static synchronized List getDecoderInfos(