From cf089b34f0aa2609a229e5ceb178d5da1c9e4d84 Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Mon, 13 Feb 2023 12:22:55 +0000 Subject: [PATCH] HDR: Remove HDR-specific error codes. It may be confusing for 3P apps, for us to have separate error codes for (1) if encoding HDR is not supported at all by the device, and (2) if encoding the format, which happens to be HDR, is not supported by the device. Instead, we can communicate this in the error message. PiperOrigin-RevId: 509188666 --- .../mh/ForceInterpretHdrVideoAsSdrTest.java | 6 ++--- .../transformer/DefaultDecoderFactory.java | 16 ++++++-------- .../transformer/DefaultEncoderFactory.java | 22 ++++++++----------- .../media3/transformer/SamplePipeline.java | 1 - .../transformer/TransformationException.java | 7 ------ .../transformer/TransformationRequest.java | 4 +--- .../transformer/VideoSamplePipeline.java | 5 +++-- 7 files changed, 22 insertions(+), 39 deletions(-) diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ForceInterpretHdrVideoAsSdrTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ForceInterpretHdrVideoAsSdrTest.java index 3872bde365..54046e3b00 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ForceInterpretHdrVideoAsSdrTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ForceInterpretHdrVideoAsSdrTest.java @@ -76,8 +76,7 @@ public class ForceInterpretHdrVideoAsSdrTest { assertFileHasColorTransfer(exportTestResult.filePath, C.COLOR_TRANSFER_SDR); Log.i(TAG, "Transformed."); } catch (TransformationException exception) { - if (exception.errorCode != TransformationException.ERROR_CODE_DECODING_FORMAT_UNSUPPORTED - && exception.errorCode != TransformationException.ERROR_CODE_HDR_DECODING_UNSUPPORTED) { + if (exception.errorCode != TransformationException.ERROR_CODE_DECODING_FORMAT_UNSUPPORTED) { throw exception; } } @@ -113,8 +112,7 @@ public class ForceInterpretHdrVideoAsSdrTest { assertFileHasColorTransfer(exportTestResult.filePath, C.COLOR_TRANSFER_SDR); Log.i(TAG, "Transformed."); } catch (TransformationException exception) { - if (exception.errorCode != TransformationException.ERROR_CODE_DECODING_FORMAT_UNSUPPORTED - && exception.errorCode != TransformationException.ERROR_CODE_HDR_DECODING_UNSUPPORTED) { + if (exception.errorCode != TransformationException.ERROR_CODE_DECODING_FORMAT_UNSUPPORTED) { throw exception; } } diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultDecoderFactory.java b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultDecoderFactory.java index 4e933ceaa9..ebe32eba33 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultDecoderFactory.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultDecoderFactory.java @@ -61,7 +61,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; @Nullable String mediaCodecName = EncoderUtil.findCodecForFormat(mediaFormat, /* isDecoder= */ true); if (mediaCodecName == null) { - throw createTransformationException(format); + throw createTransformationException( + format, /* reason= */ "The requested decoding format is not supported."); } return new DefaultCodec( context, @@ -81,11 +82,12 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; if (ColorInfo.isTransferHdr(format.colorInfo)) { if (requestSdrToneMapping && (SDK_INT < 31 || deviceNeedsNoToneMappingWorkaround())) { throw createTransformationException( - format, /* reason= */ "Tone-mapping HDR is not supported."); + format, /* reason= */ "Tone-mapping HDR is not supported on this device."); } if (SDK_INT < 29) { // TODO(b/266837571, b/267171669): Remove API version restriction after fixing linked bugs. - throw createTransformationException(format, /* reason= */ "Decoding HDR is not supported."); + throw createTransformationException( + format, /* reason= */ "Decoding HDR is not supported on this device."); } } @@ -116,7 +118,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; @Nullable String mediaCodecName = EncoderUtil.findCodecForFormat(mediaFormat, /* isDecoder= */ true); if (mediaCodecName == null) { - throw createTransformationException(format); + throw createTransformationException( + format, /* reason= */ "The requested video decoding format is not supported."); } return new DefaultCodec( context, format, mediaFormat, mediaCodecName, /* isDecoder= */ true, outputSurface); @@ -130,11 +133,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; || Build.ID.startsWith(/* Pixel Watch */ "rwd9.220429.053")); } - @RequiresNonNull("#1.sampleMimeType") - private static TransformationException createTransformationException(Format format) { - return createTransformationException(format, "The requested decoding format is not supported."); - } - @RequiresNonNull("#1.sampleMimeType") private static TransformationException createTransformationException( Format format, String reason) { diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java index 3afa7512d5..1741f56509 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java @@ -20,7 +20,6 @@ import static androidx.media3.common.util.Assertions.checkArgument; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Assertions.checkStateNotNull; -import static androidx.media3.transformer.TransformationException.ERROR_CODE_HDR_ENCODING_UNSUPPORTED; import static java.lang.Math.abs; import static java.lang.Math.floor; import static java.lang.Math.round; @@ -184,7 +183,8 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { @Nullable String mediaCodecName = EncoderUtil.findCodecForFormat(mediaFormat, /* isDecoder= */ false); if (mediaCodecName == null) { - throw createTransformationException(format); + throw createTransformationException( + format, /* errorString= */ "The requested audio encoding format is not supported."); } return new DefaultCodec( context, @@ -223,7 +223,8 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { format, requestedVideoEncoderSettings, videoEncoderSelector, enableFallback); if (encoderAndClosestFormatSupport == null) { - throw createTransformationException(format); + throw createTransformationException( + format, /* errorString= */ "The requested video encoding format is not supported."); } MediaCodecInfo encoderInfo = encoderAndClosestFormatSupport.encoder; @@ -291,7 +292,8 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_Format32bitABGR2101010); } else { - throw createTransformationException(format, ERROR_CODE_HDR_ENCODING_UNSUPPORTED); + throw createTransformationException( + format, /* errorString= */ "Encoding HDR is not supported on this device."); } } else { mediaFormat.setInteger( @@ -667,18 +669,12 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { return (int) (width * height * frameRate * 0.07 * 2); } - @RequiresNonNull("#1.sampleMimeType") - private static TransformationException createTransformationException(Format format) { - return createTransformationException( - format, TransformationException.ERROR_CODE_ENCODING_FORMAT_UNSUPPORTED); - } - @RequiresNonNull("#1.sampleMimeType") private static TransformationException createTransformationException( - Format format, @TransformationException.ErrorCode int errorCode) { + Format format, String errorString) { return TransformationException.createForCodec( - new IllegalArgumentException("The requested encoding format is not supported."), - errorCode, + new IllegalArgumentException(errorString), + TransformationException.ERROR_CODE_ENCODING_FORMAT_UNSUPPORTED, MimeTypes.isVideo(format.sampleMimeType), /* isDecoder= */ false, format); diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SamplePipeline.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SamplePipeline.java index 9e43fd8033..4dec2ba8a0 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SamplePipeline.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SamplePipeline.java @@ -55,7 +55,6 @@ import androidx.media3.decoder.DecoderInputBuffer; if (isVideo && ColorInfo.isTransferHdr(format.colorInfo)) { errorMessage += " Requested HDR colorInfo: " + format.colorInfo; - errorCode = TransformationException.ERROR_CODE_HDR_ENCODING_UNSUPPORTED; } return TransformationException.createForCodec( diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationException.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationException.java index 7510d51f6d..6a8dd3e8bc 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationException.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationException.java @@ -66,7 +66,6 @@ public final class TransformationException extends Exception { ERROR_CODE_ENCODER_INIT_FAILED, ERROR_CODE_ENCODING_FAILED, ERROR_CODE_ENCODING_FORMAT_UNSUPPORTED, - ERROR_CODE_HDR_ENCODING_UNSUPPORTED, ERROR_CODE_FRAME_PROCESSING_FAILED, ERROR_CODE_AUDIO_PROCESSING_FAILED, ERROR_CODE_MUXING_FAILED, @@ -135,8 +134,6 @@ public final class TransformationException extends Exception { public static final int ERROR_CODE_DECODING_FAILED = 3002; /** Caused by trying to decode content whose format is not supported. */ public static final int ERROR_CODE_DECODING_FORMAT_UNSUPPORTED = 3003; - /** Caused by the decoder not supporting HDR formats. */ - public static final int ERROR_CODE_HDR_DECODING_UNSUPPORTED = 3004; // Encoding errors (4xxx). @@ -151,8 +148,6 @@ public final class TransformationException extends Exception { * available. */ public static final int ERROR_CODE_ENCODING_FORMAT_UNSUPPORTED = 4003; - /** Caused by the encoder not supporting HDR formats. */ - public static final int ERROR_CODE_HDR_ENCODING_UNSUPPORTED = 4004; // Video editing errors (5xxx). @@ -184,11 +179,9 @@ public final class TransformationException extends Exception { .put("ERROR_CODE_DECODER_INIT_FAILED", ERROR_CODE_DECODER_INIT_FAILED) .put("ERROR_CODE_DECODING_FAILED", ERROR_CODE_DECODING_FAILED) .put("ERROR_CODE_DECODING_FORMAT_UNSUPPORTED", ERROR_CODE_DECODING_FORMAT_UNSUPPORTED) - .put("ERROR_CODE_HDR_DECODING_UNSUPPORTED", ERROR_CODE_HDR_DECODING_UNSUPPORTED) .put("ERROR_CODE_ENCODER_INIT_FAILED", ERROR_CODE_ENCODER_INIT_FAILED) .put("ERROR_CODE_ENCODING_FAILED", ERROR_CODE_ENCODING_FAILED) .put("ERROR_CODE_ENCODING_FORMAT_UNSUPPORTED", ERROR_CODE_ENCODING_FORMAT_UNSUPPORTED) - .put("ERROR_CODE_HDR_ENCODING_UNSUPPORTED", ERROR_CODE_HDR_ENCODING_UNSUPPORTED) .put("ERROR_CODE_FRAME_PROCESSING_FAILED", ERROR_CODE_FRAME_PROCESSING_FAILED) .put("ERROR_CODE_AUDIO_PROCESSING_FAILED", ERROR_CODE_AUDIO_PROCESSING_FAILED) .put("ERROR_CODE_MUXING_FAILED", ERROR_CODE_MUXING_FAILED) diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationRequest.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationRequest.java index d315abf70c..e81211cc17 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationRequest.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationRequest.java @@ -97,9 +97,7 @@ public final class TransformationRequest { * metadata will be ignored, contents will be displayed incorrectly, likely with a washed out * look. * - *

Use of this flag may result in {@code - * TransformationException.ERROR_CODE_HDR_DECODING_UNSUPPORTED} or {@code - * ERROR_CODE_DECODING_FORMAT_UNSUPPORTED}. + *

Use of this flag may result in {@code ERROR_CODE_DECODING_FORMAT_UNSUPPORTED}. * *

This field is experimental, and will be renamed or removed in a future release. */ diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSamplePipeline.java b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSamplePipeline.java index b69062dac7..b5d8a7eb8e 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSamplePipeline.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSamplePipeline.java @@ -88,8 +88,9 @@ import org.checkerframework.dataflow.qual.Pure; if (transformationRequest.hdrMode == HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR) { if (SDK_INT < 29) { throw TransformationException.createForCodec( - new IllegalArgumentException("Interpreting HDR video as SDR is not supported."), - TransformationException.ERROR_CODE_HDR_DECODING_UNSUPPORTED, + new IllegalArgumentException( + "Interpreting HDR video as SDR is not supported on this device."), + TransformationException.ERROR_CODE_DECODING_FORMAT_UNSUPPORTED, /* isVideo= */ true, /* isDecoder= */ true, firstInputFormat);