From 0675e4868562c2ff2c39b2d41fe0cff9c20cf4e8 Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Thu, 21 Sep 2023 04:30:53 -0700 Subject: [PATCH] HDR: Update HdrMode fallback to use OpenGL tone-mapping. OpenGL tone-mapping is more reliable and widely supported than MediaCodec tone-mapping. PiperOrigin-RevId: 567267389 --- .../media3/transformer/mh/HdrEditingTest.java | 6 +++--- .../androidx/media3/transformer/Composition.java | 10 +++++----- .../media3/transformer/VideoSampleExporter.java | 13 ++++++------- 3 files changed, 14 insertions(+), 15 deletions(-) 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 0b2230a3e7..18cc0a4d08 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 @@ -25,7 +25,7 @@ import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_DOLBY_VISION import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_DOLBY_VISION_HDR_FORMAT; import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped; import static androidx.media3.transformer.Composition.HDR_MODE_KEEP_HDR; -import static androidx.media3.transformer.Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC; +import static androidx.media3.transformer.Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL; import static androidx.media3.transformer.mh.FileUtil.assertFileHasColorTransfer; import static com.google.common.truth.Truth.assertThat; @@ -252,7 +252,7 @@ public final class HdrEditingTest { assertThat(originalTransformationRequest.hdrMode).isEqualTo(HDR_MODE_KEEP_HDR); isToneMappingFallbackApplied.set( fallbackTransformationRequest.hdrMode - == HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC); + == HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL); } }) .build(); @@ -318,7 +318,7 @@ public final class HdrEditingTest { assertThat(originalTransformationRequest.hdrMode).isEqualTo(HDR_MODE_KEEP_HDR); isToneMappingFallbackApplied.set( fallbackTransformationRequest.hdrMode - == HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC); + == HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL); } }) .build(); diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/Composition.java b/libraries/transformer/src/main/java/androidx/media3/transformer/Composition.java index ee82deea67..8f8c051b14 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/Composition.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/Composition.java @@ -255,7 +255,7 @@ public final class Composition { *

Supported on API 31+, by some device and HDR format combinations. * *

If not supported, {@link Transformer} will attempt to use {@link - * #HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC}. + * #HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL}. */ public static final int HDR_MODE_KEEP_HDR = 0; @@ -288,10 +288,10 @@ public final class Composition { /** * Interpret HDR input as SDR, likely with a washed out look. * - *

This is much more widely supported than {@link #HDR_MODE_KEEP_HDR} and {@link - * #HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC}. However, as HDR transfer functions and - * metadata will be ignored, contents will be displayed incorrectly, likely with a washed out - * look. + *

This is much more widely supported than {@link #HDR_MODE_KEEP_HDR}, {@link + * #HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC}, and {@link + * #HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL}. However, as HDR transfer functions and metadata + * will be ignored, contents will be displayed incorrectly, likely with a washed out look. * *

Using this API may lead to codec errors before API 29. * diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSampleExporter.java b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSampleExporter.java index 874041b5be..f0af001f5d 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSampleExporter.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSampleExporter.java @@ -100,7 +100,6 @@ import org.checkerframework.dataflow.qual.Pure; } else { decoderInputColor = firstInputFormat.colorInfo; } - encoderWrapper = new EncoderWrapper( encoderFactory, @@ -108,19 +107,19 @@ import org.checkerframework.dataflow.qual.Pure; muxerWrapper.getSupportedSampleMimeTypes(C.TRACK_TYPE_VIDEO), transformationRequest, fallbackListener); - encoderOutputBuffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DISABLED); + @Composition.HdrMode int hdrModeAfterFallback = encoderWrapper.getHdrModeAfterFallback(); boolean isMediaCodecToneMapping = - encoderWrapper.getHdrModeAfterFallback() == HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC + hdrModeAfterFallback == HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC && ColorInfo.isTransferHdr(decoderInputColor); ColorInfo videoGraphInputColor = isMediaCodecToneMapping ? SDR_BT709_LIMITED : decoderInputColor; boolean isGlToneMapping = - ColorInfo.isTransferHdr(decoderInputColor) - && transformationRequest.hdrMode == HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL; + hdrModeAfterFallback == HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL + && ColorInfo.isTransferHdr(decoderInputColor); ColorInfo videoGraphOutputColor; if (videoGraphInputColor.colorTransfer == C.COLOR_TRANSFER_SRGB) { // The sRGB color transfer is only used for images, so when an image gets transcoded into a @@ -274,7 +273,7 @@ import org.checkerframework.dataflow.qual.Pure; } // HdrMode fallback is only supported from HDR_MODE_KEEP_HDR to - // HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC. + // HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL. @Composition.HdrMode int hdrMode = transformationRequest.hdrMode; if (hdrMode == HDR_MODE_KEEP_HDR && isTransferHdr(inputFormat.colorInfo)) { ImmutableList hdrEncoders = @@ -289,7 +288,7 @@ import org.checkerframework.dataflow.qual.Pure; } } if (hdrEncoders.isEmpty()) { - hdrMode = HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC; + hdrMode = HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL; } }