From b9ffea68314628e6c45e7d09a7ff4ff85e2a4c1f Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Fri, 6 Sep 2019 11:15:33 +0100 Subject: [PATCH] Fix decoder selection for E-AC3 JOC streams Issue: #6398 PiperOrigin-RevId: 267563795 --- RELEASENOTES.md | 2 ++ .../android/exoplayer2/audio/MediaCodecAudioRenderer.java | 8 +++++--- .../android/exoplayer2/mediacodec/MediaCodecSelector.java | 3 ++- .../android/exoplayer2/mediacodec/MediaCodecUtil.java | 4 ++-- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 602c823c89..d50686f298 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -17,6 +17,8 @@ ([#6396](https://github.com/google/ExoPlayer/issues/6396)). * Fix audio selection issue where languages are compared by bit rate ([#6335](https://github.com/google/ExoPlayer/issues/6335)). +* Fix decoder selection for E-AC3 JOC streams + ([#6398](https://github.com/google/ExoPlayer/issues/6398)). * Fix `PlayerNotificationManager` to show play icon rather than pause icon when playback is ended ([#6324](https://github.com/google/ExoPlayer/issues/6324)). * Upgrade LibRtmp-Client-for-Android to fix RTMP playback issues 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 07a1438519..f10f45ecf3 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 @@ -45,6 +45,7 @@ import com.google.android.exoplayer2.util.MediaClock; 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; @@ -369,10 +370,11 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media format.sampleMimeType, requiresSecureDecoder, /* requiresTunnelingDecoder= */ false); 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 41cb4ee04a..c6e93d104a 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 @@ -51,7 +51,8 @@ public interface MediaCodecSelector { * @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 a6391e4cc7..671523b5e8 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 @@ -146,8 +146,8 @@ public final class MediaCodecUtil { * 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(