From da10c96229736624e83e5ecf96ba5a6926ca8da8 Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Wed, 10 Aug 2022 11:25:56 +0000 Subject: [PATCH] HDR: Clarify tone mapping fallback. createSupportedTransformationRequest is more accurate than createFallbackTransformationRequest, as a TransformationRequest will be returned regardless of whether any fallback is applied. PiperOrigin-RevId: 466641277 (cherry picked from commit c5a5364673749cb737be3df92c9521fc15207658) --- .../media3/transformer/FallbackListener.java | 12 +++++++---- .../VideoTranscodingSamplePipeline.java | 20 ++++++++++--------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/FallbackListener.java b/libraries/transformer/src/main/java/androidx/media3/transformer/FallbackListener.java index b3271472d9..bd9cf63426 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/FallbackListener.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/FallbackListener.java @@ -65,11 +65,15 @@ import androidx.media3.common.util.Util; } /** - * Updates the fallback {@link TransformationRequest}. + * Updates the {@link TransformationRequest}, if fallback is applied. * - *

Should be called with the final {@link TransformationRequest} for each track after all - * fallback has been applied. Calls {@link Transformer.Listener#onFallbackApplied(MediaItem, - * TransformationRequest, TransformationRequest)} once this method has been called for each track. + *

Should be called with the final {@link TransformationRequest} for each track, after any + * track-specific fallback changes have been applied. + * + *

Fallback is applied if the finalized {@code TransformationRequest} is different from the + * original {@code TransformationRequest}. If fallback is applied, calls {@link + * Transformer.Listener#onFallbackApplied(MediaItem, TransformationRequest, + * TransformationRequest)} once this method has been called for each track. * * @param transformationRequest The final {@link TransformationRequest} for a track. * @throws IllegalStateException If called for more tracks than registered using {@link diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoTranscodingSamplePipeline.java b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoTranscodingSamplePipeline.java index 3bb4ea0cf7..cbc13d2d43 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoTranscodingSamplePipeline.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoTranscodingSamplePipeline.java @@ -17,6 +17,7 @@ package androidx.media3.transformer; import static androidx.media3.common.util.Assertions.checkNotNull; +import static androidx.media3.common.util.Assertions.checkState; import android.content.Context; import android.media.MediaCodec; @@ -232,27 +233,27 @@ import org.checkerframework.dataflow.qual.Pure; } /** - * Creates a fallback transformation request to execute, based on device-specific support. + * Creates a {@link TransformationRequest}, based on an original {@code TransformationRequest} and + * parameters specifying alterations to it that indicate device support. * * @param transformationRequest The requested transformation. * @param hasOutputFormatRotation Whether the input video will be rotated to landscape during * processing, with {@link Format#rotationDegrees} of 90 added to the output format. * @param requestedFormat The requested format. * @param supportedFormat A format supported by the device. - * @param fallbackToSdr Whether HDR editing was requested via the TransformationRequest or - * inferred from the input and tone-mapping to SDR was used instead due to lack of encoder - * capabilities. + * @param isToneMappedToSdr Whether tone mapping to SDR will be applied. + * @return The created instance. */ @Pure - private static TransformationRequest createFallbackTransformationRequest( + private static TransformationRequest createSupportedTransformationRequest( TransformationRequest transformationRequest, boolean hasOutputFormatRotation, Format requestedFormat, Format supportedFormat, - boolean fallbackToSdr) { + boolean isToneMappedToSdr) { // TODO(b/210591626): Also update bitrate etc. once encoder configuration and fallback are // implemented. - if (!fallbackToSdr + if (transformationRequest.enableRequestSdrToneMapping == isToneMappedToSdr && Util.areEqual(requestedFormat.sampleMimeType, supportedFormat.sampleMimeType) && (hasOutputFormatRotation ? requestedFormat.width == supportedFormat.width @@ -260,7 +261,8 @@ import org.checkerframework.dataflow.qual.Pure; return transformationRequest; } TransformationRequest.Builder transformationRequestBuilder = transformationRequest.buildUpon(); - if (fallbackToSdr) { + if (transformationRequest.enableRequestSdrToneMapping != isToneMappedToSdr) { + checkState(isToneMappedToSdr); transformationRequestBuilder .setEnableRequestSdrToneMapping(true) .experimental_setEnableHdrEditing(false); @@ -429,7 +431,7 @@ import org.checkerframework.dataflow.qual.Pure; ColorInfo.isTransferHdr(inputFormat.colorInfo) && !ColorInfo.isTransferHdr(requestedEncoderFormat.colorInfo); fallbackListener.onTransformationRequestFinalized( - createFallbackTransformationRequest( + createSupportedTransformationRequest( transformationRequest, /* hasOutputFormatRotation= */ flipOrientation, requestedEncoderFormat,