diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/ExoAssetLoaderVideoRenderer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/ExoAssetLoaderVideoRenderer.java index 15d9edf6b5..bae5a3aa9e 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/ExoAssetLoaderVideoRenderer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/ExoAssetLoaderVideoRenderer.java @@ -15,9 +15,9 @@ */ package androidx.media3.transformer; -import static androidx.media3.common.ColorInfo.SDR_BT709_LIMITED; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkStateNotNull; +import static androidx.media3.transformer.TransformerUtil.getDecoderOutputColor; import android.media.MediaCodec; import androidx.annotation.Nullable; @@ -57,14 +57,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; decodeOnlyPresentationTimestamps = new ArrayList<>(); } - public static ColorInfo getDecoderOutputColor( - ColorInfo decoderInputColor, boolean isMediaCodecToneMappingRequested) { - if (isMediaCodecToneMappingRequested && ColorInfo.isTransferHdr(decoderInputColor)) { - return SDR_BT709_LIMITED; - } - return decoderInputColor; - } - @Override public String getName() { return TAG; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java index 9b5e2b4a04..7e28ef8cb5 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java @@ -24,7 +24,6 @@ import static androidx.media3.common.util.Util.contains; import static androidx.media3.transformer.AssetLoader.SUPPORTED_OUTPUT_TYPE_DECODED; import static androidx.media3.transformer.AssetLoader.SUPPORTED_OUTPUT_TYPE_ENCODED; import static androidx.media3.transformer.Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC; -import static androidx.media3.transformer.ExoAssetLoaderVideoRenderer.getDecoderOutputColor; import static androidx.media3.transformer.ExportException.ERROR_CODE_FAILED_RUNTIME_CHECK; import static androidx.media3.transformer.ExportException.ERROR_CODE_MUXING_FAILED; import static androidx.media3.transformer.MuxerWrapper.MUXER_RELEASE_REASON_CANCELLED; @@ -32,6 +31,7 @@ import static androidx.media3.transformer.MuxerWrapper.MUXER_RELEASE_REASON_COMP import static androidx.media3.transformer.MuxerWrapper.MUXER_RELEASE_REASON_ERROR; import static androidx.media3.transformer.Transformer.PROGRESS_STATE_AVAILABLE; import static androidx.media3.transformer.Transformer.PROGRESS_STATE_NOT_STARTED; +import static androidx.media3.transformer.TransformerUtil.getDecoderOutputColor; import static androidx.media3.transformer.TransformerUtil.getProcessedTrackType; import static androidx.media3.transformer.TransformerUtil.getValidColor; import static androidx.media3.transformer.TransformerUtil.maybeSetMuxerWrapperAdditionalRotationDegrees; @@ -663,13 +663,22 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; muxerWrapper, fallbackListener)); } else { - // TODO(b/267301878): Pass firstAssetLoaderOutputFormat once surface creation not in VSP. - boolean isMediaCodecToneMappingRequested = - transformationRequest.hdrMode == HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC; - ColorInfo decoderOutputColor = - getDecoderOutputColor( - getValidColor(firstAssetLoaderInputFormat.colorInfo), - isMediaCodecToneMappingRequested); + ColorInfo decoderOutputColor; + if (MimeTypes.isVideo(assetLoaderOutputFormat.sampleMimeType)) { + // TODO(b/267301878): Pass firstAssetLoaderOutputFormat once surface creation not in VSP. + boolean isMediaCodecToneMappingRequested = + transformationRequest.hdrMode == HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC; + decoderOutputColor = + getDecoderOutputColor( + getValidColor(firstAssetLoaderInputFormat.colorInfo), + isMediaCodecToneMappingRequested); + } else if (MimeTypes.isImage(assetLoaderOutputFormat.sampleMimeType)) { + decoderOutputColor = getValidColor(assetLoaderOutputFormat.colorInfo); + } else { + throw ExportException.createForUnexpected( + new IllegalArgumentException( + "assetLoaderOutputFormat has to have a audio, video or image mimetype.")); + } assetLoaderInputTracker.registerSampleExporter( C.TRACK_TYPE_VIDEO, diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerUtil.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerUtil.java index 6bdeaa7488..b9e0a4d9c9 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerUtil.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerUtil.java @@ -16,6 +16,7 @@ package androidx.media3.transformer; +import static androidx.media3.common.ColorInfo.SDR_BT709_LIMITED; import static androidx.media3.transformer.Composition.HDR_MODE_KEEP_HDR; import static java.lang.Math.round; @@ -223,4 +224,13 @@ import com.google.common.collect.ImmutableList; } return colorInfo; } + + /** Returns the decoder output color taking tone mapping into account. */ + public static ColorInfo getDecoderOutputColor( + ColorInfo decoderInputColor, boolean isMediaCodecToneMappingRequested) { + if (isMediaCodecToneMappingRequested && ColorInfo.isTransferHdr(decoderInputColor)) { + return SDR_BT709_LIMITED; + } + return decoderInputColor; + } }