diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/MediaFormatUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/MediaFormatUtil.java index 357fcca16a..758f535dd8 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/MediaFormatUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/MediaFormatUtil.java @@ -212,6 +212,8 @@ public final class MediaFormatUtil { @Nullable byte[] hdrStaticInfo = hdrStaticInfoByteBuffer != null ? getArray(hdrStaticInfoByteBuffer) : null; + // Some devices may produce invalid values from MediaFormat#getInteger. + // See b/239435670 for more information. if (!isValidColorSpace(colorSpace)) { colorSpace = Format.NO_VALUE; } diff --git a/library/transformer/src/androidTest/java/com/google/android/exoplayer2/transformer/mh/SetHdrEditingTransformationTest.java b/library/transformer/src/androidTest/java/com/google/android/exoplayer2/transformer/mh/SetHdrEditingTransformationTest.java index e9a01a2595..9eb26e7240 100644 --- a/library/transformer/src/androidTest/java/com/google/android/exoplayer2/transformer/mh/SetHdrEditingTransformationTest.java +++ b/library/transformer/src/androidTest/java/com/google/android/exoplayer2/transformer/mh/SetHdrEditingTransformationTest.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2.transformer.mh; import static com.google.android.exoplayer2.transformer.AndroidTestUtil.MP4_ASSET_1080P_1_SECOND_HDR10_VIDEO_SDR_CONTAINER; +import static com.google.android.exoplayer2.transformer.AndroidTestUtil.recordTestSkipped; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; @@ -36,9 +37,14 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class SetHdrEditingTransformationTest { @Test - public void videoDecoderUnexpectedColorInfo_completesWithError() { + public void videoDecoderUnexpectedColorInfo_completesWithError() throws Exception { Context context = ApplicationProvider.getApplicationContext(); - if (Util.SDK_INT < 24) { + if (Util.SDK_INT < 29) { + recordTestSkipped( + context, + "SetHdrEditingTransformationTest", + /* reason= */ "Skipping on this API version due to lack of support for" + + " MediaFormat#getInteger(String, int)."); return; } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultCodec.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultCodec.java index 14fae093eb..ce9235a3eb 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultCodec.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultCodec.java @@ -318,7 +318,7 @@ public final class DefaultCodec implements Codec { if (outputBufferIndex < 0) { if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { outputFormat = convertToFormat(mediaCodec.getOutputFormat()); - if (!isColorTransferEqual(configuredOutputColor, outputFormat.colorInfo)) { + if (!areColorTransfersEqual(configuredOutputColor, outputFormat.colorInfo)) { // TODO(b/237674316): These exceptions throw when the container ColorInfo doesn't match // the video ColorInfo. Instead of throwing when seeing unexpected ColorInfos, consider // reconfiguring downstream components (ex. FrameProcessor and encoder) when different @@ -372,12 +372,16 @@ public final class DefaultCodec implements Codec { : TransformationException.ERROR_CODE_ENCODING_FAILED); } - private static boolean isColorTransferEqual( + private static boolean areColorTransfersEqual( @Nullable ColorInfo colorInfo1, @Nullable ColorInfo colorInfo2) { - @C.ColorTransfer - int transfer1 = (colorInfo1 != null) ? colorInfo1.colorTransfer : C.COLOR_TRANSFER_SDR; - @C.ColorTransfer - int transfer2 = (colorInfo2 != null) ? colorInfo2.colorTransfer : C.COLOR_TRANSFER_SDR; + @C.ColorTransfer int transfer1 = C.COLOR_TRANSFER_SDR; + if (colorInfo1 != null && colorInfo1.colorTransfer != Format.NO_VALUE) { + transfer1 = colorInfo1.colorTransfer; + } + @C.ColorTransfer int transfer2 = C.COLOR_TRANSFER_SDR; + if (colorInfo2 != null && colorInfo2.colorTransfer != Format.NO_VALUE) { + transfer2 = colorInfo2.colorTransfer; + } return transfer1 == transfer2; }