From 78c103e7ea0e31400d4f7e3375b7a7fdbdd1c143 Mon Sep 17 00:00:00 2001 From: krocard Date: Tue, 31 Mar 2020 15:55:40 +0100 Subject: [PATCH] Remove passthrough from MediaCodecInfo Selection of a passthrough codec will rarely (if ever) need to be customized, so remove this capability from MediaCodecInfo. Applications can still customize whether passthrough is used by overriding MediaCodecAudioRenderer.usePassthrough, which now also checks for a passthrough codec. #exo-offload PiperOrigin-RevId: 303964682 --- .../audio/MediaCodecAudioRenderer.java | 26 ++++++------ .../exoplayer2/mediacodec/MediaCodecInfo.java | 41 ++++--------------- .../mediacodec/MediaCodecSelector.java | 27 +----------- .../exoplayer2/mediacodec/MediaCodecUtil.java | 5 +-- 4 files changed, 21 insertions(+), 78 deletions(-) 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 714b5f0615..90fb1f8110 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 @@ -217,9 +217,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media @TunnelingSupport int tunnelingSupport = Util.SDK_INT >= 21 ? TUNNELING_SUPPORTED : TUNNELING_NOT_SUPPORTED; boolean supportsFormatDrm = supportsFormatDrm(format); - if (supportsFormatDrm - && allowPassthrough(format.channelCount, mimeType) - && mediaCodecSelector.getPassthroughDecoderInfo() != null) { + if (supportsFormatDrm && usePassthrough(format.channelCount, mimeType)) { return RendererCapabilities.create(FORMAT_HANDLED, ADAPTIVE_NOT_SEAMLESS, tunnelingSupport); } if ((MimeTypes.AUDIO_RAW.equals(mimeType) @@ -257,12 +255,8 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media if (mimeType == null) { return Collections.emptyList(); } - if (allowPassthrough(format.channelCount, mimeType)) { - @Nullable - MediaCodecInfo passthroughDecoderInfo = mediaCodecSelector.getPassthroughDecoderInfo(); - if (passthroughDecoderInfo != null) { - return Collections.singletonList(passthroughDecoderInfo); - } + if (usePassthrough(format.channelCount, mimeType)) { + return Collections.singletonList(MediaCodecUtil.getPassthroughDecoderInfo()); } List decoderInfos = mediaCodecSelector.getDecoderInfos( @@ -286,9 +280,12 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media * not known. * @param mimeType The type of input media. * @return Whether passthrough playback is supported. + * @throws DecoderQueryException If there was an error querying the available passthrough + * decoders. */ - protected boolean allowPassthrough(int channelCount, String mimeType) { - return getPassthroughEncoding(channelCount, mimeType) != C.ENCODING_INVALID; + protected boolean usePassthrough(int channelCount, String mimeType) throws DecoderQueryException { + return getPassthroughEncoding(channelCount, mimeType) != C.ENCODING_INVALID + && MediaCodecUtil.getPassthroughDecoderInfo() != null; } @Override @@ -301,10 +298,11 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media codecMaxInputSize = getCodecMaxInputSize(codecInfo, format, getStreamFormats()); codecNeedsDiscardChannelsWorkaround = codecNeedsDiscardChannelsWorkaround(codecInfo.name); codecNeedsEosBufferTimestampWorkaround = codecNeedsEosBufferTimestampWorkaround(codecInfo.name); - passthroughEnabled = codecInfo.passthrough; - String codecMimeType = passthroughEnabled ? MimeTypes.AUDIO_RAW : codecInfo.codecMimeType; + passthroughEnabled = + MimeTypes.AUDIO_RAW.equals(codecInfo.mimeType) + && !MimeTypes.AUDIO_RAW.equals(format.sampleMimeType); MediaFormat mediaFormat = - getMediaFormat(format, codecMimeType, codecMaxInputSize, codecOperatingRate); + getMediaFormat(format, codecInfo.codecMimeType, codecMaxInputSize, codecOperatingRate); codec.configure(mediaFormat, /* surface= */ null, crypto, /* flags= */ 0); if (passthroughEnabled) { // Store the input MIME type if we're using the passthrough codec. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecInfo.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecInfo.java index 3bd051214c..4094f4bdfa 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecInfo.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecInfo.java @@ -50,15 +50,14 @@ public final class MediaCodecInfo { */ public final String name; - /** The MIME type handled by the codec, or {@code null} if this is a passthrough codec. */ - @Nullable public final String mimeType; + /** The MIME type handled by the codec. */ + public final String mimeType; /** - * The MIME type that the codec uses for media of type {@link #mimeType}, or {@code null} if this - * is a passthrough codec. Equal to {@link #mimeType} unless the codec is known to use a - * non-standard MIME type alias. + * The MIME type that the codec uses for media of type {@link #mimeType}. Equal to {@link + * #mimeType} unless the codec is known to use a non-standard MIME type alias. */ - @Nullable public final String codecMimeType; + public final String codecMimeType; /** * The capabilities of the decoder, like the profiles/levels it supports, or {@code null} if not @@ -90,9 +89,6 @@ public final class MediaCodecInfo { */ public final boolean secure; - /** Whether this instance describes a passthrough codec. */ - public final boolean passthrough; - /** * Whether the codec is hardware accelerated. * @@ -122,26 +118,6 @@ public final class MediaCodecInfo { private final boolean isVideo; - /** - * Creates an instance representing an audio passthrough decoder. - * - * @param name The name of the {@link MediaCodec}. - * @return The created instance. - */ - public static MediaCodecInfo newPassthroughInstance(String name) { - return new MediaCodecInfo( - name, - /* mimeType= */ null, - /* codecMimeType= */ null, - /* capabilities= */ null, - /* passthrough= */ true, - /* hardwareAccelerated= */ false, - /* softwareOnly= */ true, - /* vendor= */ false, - /* forceDisableAdaptive= */ false, - /* forceSecure= */ false); - } - /** * Creates an instance. * @@ -173,7 +149,6 @@ public final class MediaCodecInfo { mimeType, codecMimeType, capabilities, - /* passthrough= */ false, hardwareAccelerated, softwareOnly, vendor, @@ -183,10 +158,9 @@ public final class MediaCodecInfo { private MediaCodecInfo( String name, - @Nullable String mimeType, - @Nullable String codecMimeType, + String mimeType, + String codecMimeType, @Nullable CodecCapabilities capabilities, - boolean passthrough, boolean hardwareAccelerated, boolean softwareOnly, boolean vendor, @@ -196,7 +170,6 @@ public final class MediaCodecInfo { this.mimeType = mimeType; this.codecMimeType = codecMimeType; this.capabilities = capabilities; - this.passthrough = passthrough; this.hardwareAccelerated = hardwareAccelerated; this.softwareOnly = softwareOnly; this.vendor = vendor; 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 10ff81147e..7f39dced61 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 @@ -16,7 +16,6 @@ package com.google.android.exoplayer2.mediacodec; import android.media.MediaCodec; -import androidx.annotation.Nullable; import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException; import java.util.List; @@ -29,22 +28,7 @@ public interface MediaCodecSelector { * Default implementation of {@link MediaCodecSelector}, which returns the preferred decoder for * the given format. */ - MediaCodecSelector DEFAULT = - new MediaCodecSelector() { - @Override - public List getDecoderInfos( - String mimeType, boolean requiresSecureDecoder, boolean requiresTunnelingDecoder) - throws DecoderQueryException { - return MediaCodecUtil.getDecoderInfos( - mimeType, requiresSecureDecoder, requiresTunnelingDecoder); - } - - @Override - @Nullable - public MediaCodecInfo getPassthroughDecoderInfo() throws DecoderQueryException { - return MediaCodecUtil.getPassthroughDecoderInfo(); - } - }; + MediaCodecSelector DEFAULT = MediaCodecUtil::getDecoderInfos; /** * Returns a list of decoders that can decode media in the specified MIME type, in priority order. @@ -59,13 +43,4 @@ public interface MediaCodecSelector { List getDecoderInfos( String mimeType, boolean requiresSecureDecoder, boolean requiresTunnelingDecoder) throws DecoderQueryException; - - /** - * Selects a decoder to instantiate for audio passthrough. - * - * @return A {@link MediaCodecInfo} describing the decoder, or null if no suitable decoder exists. - * @throws DecoderQueryException Thrown if there was an error querying decoders. - */ - @Nullable - MediaCodecInfo getPassthroughDecoderInfo() throws DecoderQueryException; } 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 d5e6b97fce..db68fb3e89 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 @@ -123,10 +123,7 @@ public final class MediaCodecUtil { */ @Nullable public static MediaCodecInfo getPassthroughDecoderInfo() throws DecoderQueryException { - @Nullable - MediaCodecInfo decoderInfo = - getDecoderInfo(MimeTypes.AUDIO_RAW, /* secure= */ false, /* tunneling= */ false); - return decoderInfo == null ? null : MediaCodecInfo.newPassthroughInstance(decoderInfo.name); + return getDecoderInfo(MimeTypes.AUDIO_RAW, /* secure= */ false, /* tunneling= */ false); } /**