From 465301da7c4045162a220221f03cd16c63aad3d0 Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Tue, 21 Feb 2023 14:30:23 +0000 Subject: [PATCH] MediaFormatUtil: Reduce Color API 29 restriction to API 24. Implement getMediaFormatInteger, a helper method simulating mediaformat.getInteger(name, defaultValue). This reduces the API 29 restriction from MediaFormatUtil.getColorInfo to API 24, in particular removing the method-based restriction to a constant-based restriction, so that we can reduce usage of the API 29 class. This also allows us to slightly simplify prior use-cases where we'd check containsKey and getInteger to have a default value. PiperOrigin-RevId: 511184301 --- .../media3/common/util/MediaFormatUtil.java | 24 ++++++++++++--- .../media3/transformer/mh/FileUtil.java | 7 ++--- .../media3/transformer/mh/HdrEditingTest.java | 8 ----- .../media3/transformer/DefaultCodec.java | 30 +++++++++---------- 4 files changed, 37 insertions(+), 32 deletions(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/util/MediaFormatUtil.java b/libraries/common/src/main/java/androidx/media3/common/util/MediaFormatUtil.java index 0bf588c27c..e4a82ab569 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/MediaFormatUtil.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/MediaFormatUtil.java @@ -197,18 +197,24 @@ public final class MediaFormatUtil { /** * Creates and returns a {@code ColorInfo}, if a valid instance is described in the {@link * MediaFormat}. + * + *

Under API 24, {@code null} will always be returned, because {@link MediaFormat} color keys + * like {@link MediaFormat#KEY_COLOR_STANDARD} were only added in API 24. */ @Nullable public static ColorInfo getColorInfo(MediaFormat mediaFormat) { - if (SDK_INT < 29) { + if (SDK_INT < 24) { + // MediaFormat KEY_COLOR_TRANSFER and other KEY_COLOR values available from API 24. return null; } int colorSpace = - mediaFormat.getInteger(MediaFormat.KEY_COLOR_STANDARD, /* defaultValue= */ Format.NO_VALUE); + getInteger( + mediaFormat, MediaFormat.KEY_COLOR_STANDARD, /* defaultValue= */ Format.NO_VALUE); int colorRange = - mediaFormat.getInteger(MediaFormat.KEY_COLOR_RANGE, /* defaultValue= */ Format.NO_VALUE); + getInteger(mediaFormat, MediaFormat.KEY_COLOR_RANGE, /* defaultValue= */ Format.NO_VALUE); int colorTransfer = - mediaFormat.getInteger(MediaFormat.KEY_COLOR_TRANSFER, /* defaultValue= */ Format.NO_VALUE); + getInteger( + mediaFormat, MediaFormat.KEY_COLOR_TRANSFER, /* defaultValue= */ Format.NO_VALUE); @Nullable ByteBuffer hdrStaticInfoByteBuffer = mediaFormat.getByteBuffer(MediaFormat.KEY_HDR_STATIC_INFO); @Nullable @@ -240,6 +246,16 @@ public final class MediaFormatUtil { return null; } + /** + * Provides the same functionality as {@link MediaFormat#getInteger(String, int)}. + * + *

{@link MediaFormat#getInteger(String, int)} is only available from API 29. This convenience + * method provides support on lower API versions. + */ + public static int getInteger(MediaFormat mediaFormat, String name, int defaultValue) { + return mediaFormat.containsKey(name) ? mediaFormat.getInteger(name) : defaultValue; + } + public static byte[] getArray(ByteBuffer byteBuffer) { byte[] array = new byte[byteBuffer.remaining()]; byteBuffer.get(array); diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/FileUtil.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/FileUtil.java index 716f1c6abc..8c7eeb781a 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/FileUtil.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/FileUtil.java @@ -34,7 +34,7 @@ import java.io.IOException; /** * Assert that the file has a certain color transfer, if supported on this device. * - *

This will silently pass if under API 29, or if decoding this file is not supported on this + *

This will silently pass if under API 24, or if decoding this file is not supported on this * device. * * @param filePath The path of the input file. @@ -43,9 +43,8 @@ import java.io.IOException; */ public static void maybeAssertFileHasColorTransfer( @Nullable String filePath, @C.ColorTransfer int expectedColorTransfer) throws IOException { - if (Util.SDK_INT < 29) { - // Skipping on this API version due to lack of support for MediaFormat#getInteger, which is - // required for MediaFormatUtil#getColorInfo. + if (Util.SDK_INT < 24) { + // MediaFormat#KEY_COLOR_TRANSFER unsupported before API 24. return; } DecodeOneFrameUtil.Listener listener = diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrEditingTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrEditingTest.java index 26cbf50303..e78d1eb08e 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrEditingTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrEditingTest.java @@ -31,7 +31,6 @@ import androidx.media3.common.ColorInfo; import androidx.media3.common.Effect; import androidx.media3.common.MediaItem; import androidx.media3.common.util.Log; -import androidx.media3.common.util.Util; import androidx.media3.effect.ScaleAndRotateTransformation; import androidx.media3.transformer.EditedMediaItem; import androidx.media3.transformer.Effects; @@ -282,13 +281,6 @@ public class HdrEditingTest { public void exportUnexpectedColorInfo() throws Exception { String testId = "exportUnexpectedColorInfo"; Context context = ApplicationProvider.getApplicationContext(); - if (Util.SDK_INT < 29) { - recordTestSkipped( - context, - testId, - /* reason= */ "API version lacks support for MediaFormat#getInteger(String, int)."); - return; - } Transformer transformer = new Transformer.Builder(context).build(); MediaItem mediaItem = diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultCodec.java b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultCodec.java index 1bed9bd4fd..68a1d283b4 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultCodec.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultCodec.java @@ -109,18 +109,17 @@ public final class DefaultCodec implements Codec { @Nullable MediaCodec mediaCodec = null; @Nullable Surface inputSurface = null; - boolean requestedHdrToneMapping = - SDK_INT >= 29 && Api29.isSdrToneMappingEnabled(configurationMediaFormat); + boolean requestedHdrToneMapping = isSdrToneMappingEnabled(configurationMediaFormat); try { mediaCodec = MediaCodec.createByCodecName(mediaCodecName); configureCodec(mediaCodec, configurationMediaFormat, isDecoder, outputSurface); - if (SDK_INT >= 29 && requestedHdrToneMapping) { + if (requestedHdrToneMapping) { // The MediaCodec input format reflects whether tone-mapping is possible after configure(). // See // https://developer.android.com/reference/android/media/MediaFormat#KEY_COLOR_TRANSFER_REQUEST. checkArgument( - Api29.isSdrToneMappingEnabled(mediaCodec.getInputFormat()), + isSdrToneMappingEnabled(mediaCodec.getInputFormat()), "Tone-mapping requested but not supported by the decoder."); } if (isVideo && !isDecoder) { @@ -327,10 +326,10 @@ public final class DefaultCodec implements Codec { if (outputBufferIndex < 0) { if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { outputFormat = convertToFormat(mediaCodec.getOutputFormat()); - boolean isToneMappingEnabled = - SDK_INT >= 29 && Api29.isSdrToneMappingEnabled(configurationMediaFormat); ColorInfo expectedColorInfo = - isToneMappingEnabled ? ColorInfo.SDR_BT709_LIMITED : configurationFormat.colorInfo; + isSdrToneMappingEnabled(configurationMediaFormat) + ? ColorInfo.SDR_BT709_LIMITED + : configurationFormat.colorInfo; if (!areColorTransfersEqual(expectedColorInfo, outputFormat.colorInfo)) { // TODO(b/237674316): The container ColorInfo's transfer doesn't match the decoder output // MediaFormat, or we requested tone-mapping but it hasn't been applied. We should @@ -457,20 +456,19 @@ public final class DefaultCodec implements Codec { TraceUtil.endSection(); } + private static boolean isSdrToneMappingEnabled(MediaFormat mediaFormat) { + // MediaFormat.KEY_COLOR_TRANSFER_REQUEST was added in API 31. + return SDK_INT >= 31 + && MediaFormatUtil.getInteger( + mediaFormat, MediaFormat.KEY_COLOR_TRANSFER_REQUEST, /* defaultValue= */ 0) + == MediaFormat.COLOR_TRANSFER_SDR_VIDEO; + } + @RequiresApi(29) private static final class Api29 { @DoNotInline public static String getCanonicalName(MediaCodec mediaCodec) { return mediaCodec.getCanonicalName(); } - - @DoNotInline - public static boolean isSdrToneMappingEnabled(MediaFormat mediaFormat) { - // MediaFormat.getInteger(String, int) was added in API 29 but applying a color transfer - // request is only possible from API 31. - return SDK_INT >= 31 - && mediaFormat.getInteger(MediaFormat.KEY_COLOR_TRANSFER_REQUEST, /* defaultValue= */ 0) - == MediaFormat.COLOR_TRANSFER_SDR_VIDEO; - } } }