From 129a6e0cc68ab52fb5b776d6b93379306efff0ea Mon Sep 17 00:00:00 2001 From: kimvde Date: Tue, 9 May 2023 12:47:06 +0000 Subject: [PATCH] Fix encoder expecting HDR while tone-mapping requested If tone-mapping was requested for a device supporting HDR encoding, isToneMapped was false in VideoSamplePipeline.EncoderWrapper. This was causing the encoder to expect HDR. Also did some renamings to improve readability PiperOrigin-RevId: 530584010 --- .../transformer/VideoSamplePipeline.java | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) 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 2cff9695a8..65fb75d17e 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSamplePipeline.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSamplePipeline.java @@ -118,7 +118,7 @@ import org.checkerframework.dataflow.qual.Pure; fallbackListener); boolean isMediaCodecToneMapping = - encoderWrapper.getSupportedInputHdrMode() == HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC + encoderWrapper.getHdrModeAfterFallback() == HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC && ColorInfo.isTransferHdr(decoderInputColor); videoFrameProcessorInputColor = isMediaCodecToneMapping ? SDR_BT709_LIMITED : decoderInputColor; @@ -330,8 +330,7 @@ import org.checkerframework.dataflow.qual.Pure; private final TransformationRequest transformationRequest; private final FallbackListener fallbackListener; private final String requestedOutputMimeType; - private final boolean isInputToneMapped; - private final @TransformationRequest.HdrMode int supportedFallbackHdrMode; + private final @TransformationRequest.HdrMode int hdrModeAfterFallback; private @MonotonicNonNull SurfaceInfo encoderSurfaceInfo; @@ -361,16 +360,14 @@ import org.checkerframework.dataflow.qual.Pure; requestedOutputMimeType = inputSampleMimeType; } - isInputToneMapped = - isTransferHdr(inputFormat.colorInfo) - && getSupportedEncodersForHdrEditing(requestedOutputMimeType, inputFormat.colorInfo) - .isEmpty(); - // HdrMode fallback is only supported from HDR_MODE_KEEP_HDR to // HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC. boolean fallbackToMediaCodec = - isInputToneMapped && transformationRequest.hdrMode == HDR_MODE_KEEP_HDR; - supportedFallbackHdrMode = + isTransferHdr(inputFormat.colorInfo) + && transformationRequest.hdrMode == HDR_MODE_KEEP_HDR + && getSupportedEncodersForHdrEditing(requestedOutputMimeType, inputFormat.colorInfo) + .isEmpty(); + hdrModeAfterFallback = fallbackToMediaCodec ? HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC : transformationRequest.hdrMode; @@ -378,6 +375,11 @@ import org.checkerframework.dataflow.qual.Pure; /** Returns the {@link ColorInfo} expected from the input surface. */ public ColorInfo getSupportedInputColor() { + boolean isHdrEditingEnabled = + transformationRequest.hdrMode == HDR_MODE_KEEP_HDR + && !getSupportedEncodersForHdrEditing(requestedOutputMimeType, inputFormat.colorInfo) + .isEmpty(); + boolean isInputToneMapped = !isHdrEditingEnabled && isTransferHdr(inputFormat.colorInfo); if (isInputToneMapped) { // When tone-mapping HDR to SDR is enabled, assume we get BT.709 to avoid having the encoder // populate default color info, which depends on the resolution. @@ -389,8 +391,8 @@ import org.checkerframework.dataflow.qual.Pure; return checkNotNull(inputFormat.colorInfo); } - public @TransformationRequest.HdrMode int getSupportedInputHdrMode() { - return supportedFallbackHdrMode; + public @TransformationRequest.HdrMode int getHdrModeAfterFallback() { + return hdrModeAfterFallback; } @Nullable @@ -441,7 +443,7 @@ import org.checkerframework.dataflow.qual.Pure; /* hasOutputFormatRotation= */ outputRotationDegrees != 0, requestedEncoderFormat, actualEncoderFormat, - supportedFallbackHdrMode)); + hdrModeAfterFallback)); encoderSurfaceInfo = new SurfaceInfo(