From 2db2de59933f87e7b76cbaefda56d25633bf252d Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Tue, 9 May 2023 15:42:56 +0000 Subject: [PATCH] Transformer: Add codec support for Dolby Vision HDR video Allow use of H265/H264 codecs for Dolby Vision video. Also, reflow ExoPlayer code to use this new utility class PiperOrigin-RevId: 530619388 --- .../audio/MediaCodecAudioRenderer.java | 16 +--- .../exoplayer/mediacodec/MediaCodecUtil.java | 75 +++++++++++++++++- .../video/MediaCodecVideoRenderer.java | 27 +++---- .../test/assets/media/mp4/dolbyVision-hdr.MOV | Bin 0 -> 64565 bytes .../media3/transformer/AndroidTestUtil.java | 2 + .../media3/transformer/mh/HdrEditingTest.java | 28 +++++++ .../transformer/DefaultDecoderFactory.java | 9 ++- .../transformer/VideoSamplePipeline.java | 72 ++++++++++------- 8 files changed, 166 insertions(+), 63 deletions(-) create mode 100644 libraries/test_data/src/test/assets/media/mp4/dolbyVision-hdr.MOV diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/MediaCodecAudioRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/MediaCodecAudioRenderer.java index 4eff06394d..db4a232e78 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/MediaCodecAudioRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/MediaCodecAudioRenderer.java @@ -398,20 +398,8 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media return ImmutableList.of(codecInfo); } } - List decoderInfos = - mediaCodecSelector.getDecoderInfos( - mimeType, requiresSecureDecoder, /* requiresTunnelingDecoder= */ false); - @Nullable String alternativeMimeType = MediaCodecUtil.getAlternativeCodecMimeType(format); - if (alternativeMimeType == null) { - return ImmutableList.copyOf(decoderInfos); - } - List alternativeDecoderInfos = - mediaCodecSelector.getDecoderInfos( - alternativeMimeType, requiresSecureDecoder, /* requiresTunnelingDecoder= */ false); - return ImmutableList.builder() - .addAll(decoderInfos) - .addAll(alternativeDecoderInfos) - .build(); + return MediaCodecUtil.getDecoderInfosSoftMatch( + mediaCodecSelector, format, requiresSecureDecoder, /* requiresTunnelingDecoder= */ false); } @Override diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecUtil.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecUtil.java index 81af112a67..17b67e3a77 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecUtil.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecUtil.java @@ -44,6 +44,7 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.checkerframework.checker.nullness.qual.EnsuresNonNull; +import org.checkerframework.checker.nullness.qual.RequiresNonNull; /** A utility class for querying the available codecs. */ @SuppressLint("InlinedApi") @@ -189,6 +190,77 @@ public final class MediaCodecUtil { return immutableDecoderInfos; } + /** + * Returns a list of decoders that can decode media in the specified format, in the priority order + * specified by the {@link MediaCodecSelector}. + * + *

Since the {@link MediaCodecSelector} only has access to {@link Format#sampleMimeType}, the + * list is not ordered to account for whether each decoder supports the details of the format + * (e.g., taking into account the format's profile, level, resolution and so on). {@link + * #getDecoderInfosSortedByFormatSupport} can be used to further sort the list into an order where + * decoders that fully support the format come first. + * + *

This list is more complete than {@link #getDecoderInfos}, as it also considers alternative + * MIME types that are a close match using {@link #getAlternativeCodecMimeType}. + * + * @param mediaCodecSelector The decoder selector. + * @param format The {@link Format} for which a decoder is required. + * @param requiresSecureDecoder Whether a secure decoder is required. + * @param requiresTunnelingDecoder Whether a tunneling decoder is required. + * @return A list of {@link MediaCodecInfo}s corresponding to decoders. May be empty. + * @throws DecoderQueryException Thrown if there was an error querying decoders. + */ + @RequiresNonNull("#2.sampleMimeType") + public static List getDecoderInfosSoftMatch( + MediaCodecSelector mediaCodecSelector, + Format format, + boolean requiresSecureDecoder, + boolean requiresTunnelingDecoder) + throws DecoderQueryException { + List decoderInfos = + mediaCodecSelector.getDecoderInfos( + format.sampleMimeType, requiresSecureDecoder, requiresTunnelingDecoder); + List alternativeDecoderInfos = + getAlternativeDecoderInfos( + mediaCodecSelector, format, requiresSecureDecoder, requiresTunnelingDecoder); + return ImmutableList.builder() + .addAll(decoderInfos) + .addAll(alternativeDecoderInfos) + .build(); + } + + /** + * Returns a list of decoders for {@linkplain #getAlternativeCodecMimeType alternative MIME types} + * that can decode samples of the provided {@link Format}, in the priority order specified by the + * {@link MediaCodecSelector}. + * + *

Since the {@link MediaCodecSelector} only has access to {@link Format#sampleMimeType}, the + * list is not ordered to account for whether each decoder supports the details of the format + * (e.g., taking into account the format's profile, level, resolution and so on). {@link + * #getDecoderInfosSortedByFormatSupport} can be used to further sort the list into an order where + * decoders that fully support the format come first. + * + * @param mediaCodecSelector The decoder selector. + * @param format The {@link Format} for which an alternative decoder is required. + * @param requiresSecureDecoder Whether a secure decoder is required. + * @param requiresTunnelingDecoder Whether a tunneling decoder is required. + * @return A list of {@link MediaCodecInfo}s corresponding to alternative decoders. May be empty. + * @throws DecoderQueryException Thrown if there was an error querying decoders. + */ + public static List getAlternativeDecoderInfos( + MediaCodecSelector mediaCodecSelector, + Format format, + boolean requiresSecureDecoder, + boolean requiresTunnelingDecoder) + throws DecoderQueryException { + @Nullable String alternativeMimeType = getAlternativeCodecMimeType(format); + if (alternativeMimeType == null) { + return ImmutableList.of(); + } + return mediaCodecSelector.getDecoderInfos( + alternativeMimeType, requiresSecureDecoder, requiresTunnelingDecoder); + } + /** * Returns a copy of the provided decoder list sorted such that decoders with functional format * support are listed first. The returned list is modifiable for convenience. @@ -282,8 +354,7 @@ public final class MediaCodecUtil { // be done for profile CodecProfileLevel.DolbyVisionProfileDvheStn and profile // CodecProfileLevel.DolbyVisionProfileDvheDtb because the first one is not backward // compatible and the second one is deprecated and is not always backward compatible. - @Nullable - Pair codecProfileAndLevel = MediaCodecUtil.getCodecProfileAndLevel(format); + @Nullable Pair codecProfileAndLevel = getCodecProfileAndLevel(format); if (codecProfileAndLevel != null) { int profile = codecProfileAndLevel.first; if (profile == CodecProfileLevel.DolbyVisionProfileDvheDtr diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java index 757fb57856..23e96b6c9b 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java @@ -499,30 +499,21 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { boolean requiresSecureDecoder, boolean requiresTunnelingDecoder) throws DecoderQueryException { - @Nullable String mimeType = format.sampleMimeType; - if (mimeType == null) { + if (format.sampleMimeType == null) { return ImmutableList.of(); } - List decoderInfos = - mediaCodecSelector.getDecoderInfos( - mimeType, requiresSecureDecoder, requiresTunnelingDecoder); - @Nullable String alternativeMimeType = MediaCodecUtil.getAlternativeCodecMimeType(format); - if (alternativeMimeType == null) { - return ImmutableList.copyOf(decoderInfos); - } - List alternativeDecoderInfos = - mediaCodecSelector.getDecoderInfos( - alternativeMimeType, requiresSecureDecoder, requiresTunnelingDecoder); if (Util.SDK_INT >= 26 && MimeTypes.VIDEO_DOLBY_VISION.equals(format.sampleMimeType) - && !alternativeDecoderInfos.isEmpty() && !Api26.doesDisplaySupportDolbyVision(context)) { - return ImmutableList.copyOf(alternativeDecoderInfos); + List alternativeDecoderInfos = + MediaCodecUtil.getAlternativeDecoderInfos( + mediaCodecSelector, format, requiresSecureDecoder, requiresTunnelingDecoder); + if (!alternativeDecoderInfos.isEmpty()) { + return alternativeDecoderInfos; + } } - return ImmutableList.builder() - .addAll(decoderInfos) - .addAll(alternativeDecoderInfos) - .build(); + return MediaCodecUtil.getDecoderInfosSoftMatch( + mediaCodecSelector, format, requiresSecureDecoder, requiresTunnelingDecoder); } @RequiresApi(26) diff --git a/libraries/test_data/src/test/assets/media/mp4/dolbyVision-hdr.MOV b/libraries/test_data/src/test/assets/media/mp4/dolbyVision-hdr.MOV new file mode 100644 index 0000000000000000000000000000000000000000..d8b8e826b5b3446b0984f7b3b89eea2e69680293 GIT binary patch literal 64565 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 z

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 literal 0 HcmV?d00001 diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/AndroidTestUtil.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/AndroidTestUtil.java index 530ec14e5d..93f4916b35 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/AndroidTestUtil.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/AndroidTestUtil.java @@ -148,6 +148,8 @@ public final class AndroidTestUtil { .setCodecs("hvc1.2.4.L153") .build(); + public static final String MP4_ASSET_DOLBY_VISION_HDR = "asset:///media/mp4/dolbyVision-hdr.MOV"; + public static final String MP4_ASSET_4K60_PORTRAIT_URI_STRING = "asset:///media/mp4/portrait_4k60.mp4"; public static final Format MP4_ASSET_4K60_PORTRAIT_FORMAT = 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 27a6808132..ddc318384b 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 @@ -19,6 +19,7 @@ import static androidx.media3.common.MimeTypes.VIDEO_H265; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10; import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10; +import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_DOLBY_VISION_HDR; import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped; import static androidx.media3.transformer.mh.FileUtil.maybeAssertFileHasColorTransfer; import static com.google.common.truth.Truth.assertThat; @@ -166,6 +167,33 @@ public class HdrEditingTest { maybeAssertFileHasColorTransfer(exportTestResult.filePath, C.COLOR_TRANSFER_HLG); } + @Test + public void exportAndTranscode_dolbyVisionFile_whenHdrEditingIsSupported_exports() + throws Exception { + String testId = "exportAndTranscode_dolbyVisionFile_whenHdrEditingIsSupported_exports"; + Context context = ApplicationProvider.getApplicationContext(); + // This dolby vision file has a ColorInfo identical to HLG10. + if (!deviceSupportsHdrEditing(VIDEO_H265, HLG10_DEFAULT_COLOR_INFO)) { + recordTestSkipped(context, testId, /* reason= */ "Device lacks HLG10 editing support."); + return; + } + + Transformer transformer = new Transformer.Builder(context).build(); + MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_DOLBY_VISION_HDR)); + ImmutableList videoEffects = + ImmutableList.of( + new ScaleAndRotateTransformation.Builder().setRotationDegrees(180).build()); + Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); + + ExportTestResult exportTestResult = + new TransformerAndroidTestRunner.Builder(context, transformer) + .build() + .run(testId, editedMediaItem); + maybeAssertFileHasColorTransfer(exportTestResult.filePath, C.COLOR_TRANSFER_HLG); + } + @Test public void exportAndTranscode_hdr10File_whenHdrEditingUnsupported_toneMapsOrThrows() throws 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 acf3117a3c..5f11677c8e 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultDecoderFactory.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultDecoderFactory.java @@ -34,6 +34,7 @@ import androidx.media3.common.util.Log; import androidx.media3.common.util.MediaFormatUtil; import androidx.media3.common.util.Util; import androidx.media3.exoplayer.mediacodec.MediaCodecInfo; +import androidx.media3.exoplayer.mediacodec.MediaCodecSelector; import androidx.media3.exoplayer.mediacodec.MediaCodecUtil; import java.util.List; import org.checkerframework.checker.nullness.qual.RequiresNonNull; @@ -145,10 +146,14 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private static String getMediaCodecNameForDecoding(Format format) throws MediaCodecUtil.DecoderQueryException, ExportException { + checkNotNull(format.sampleMimeType); List decoderInfos = MediaCodecUtil.getDecoderInfosSortedByFormatSupport( - MediaCodecUtil.getDecoderInfos( - checkNotNull(format.sampleMimeType), /* secure= */ false, /* tunneling= */ false), + MediaCodecUtil.getDecoderInfosSoftMatch( + MediaCodecSelector.DEFAULT, + format, + /* requiresSecureDecoder= */ false, + /* requiresTunnelingDecoder= */ false), format); if (decoderInfos.isEmpty()) { throw createExportException(format, /* reason= */ "No decoders for format"); 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 65fb75d17e..38bc238c8f 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSamplePipeline.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSamplePipeline.java @@ -31,6 +31,8 @@ import static androidx.media3.transformer.TransformationRequest.HDR_MODE_TONE_MA import android.content.Context; import android.graphics.Bitmap; import android.media.MediaCodec; +import android.media.MediaCodecInfo; +import android.util.Pair; import android.view.Surface; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -51,6 +53,7 @@ import androidx.media3.common.util.Util; import androidx.media3.decoder.DecoderInputBuffer; import androidx.media3.effect.DebugTraceUtil; import androidx.media3.effect.Presentation; +import androidx.media3.exoplayer.mediacodec.MediaCodecUtil; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.MoreExecutors; import java.nio.ByteBuffer; @@ -350,8 +353,16 @@ import org.checkerframework.dataflow.qual.Pure; this.muxerSupportedMimeTypes = muxerSupportedMimeTypes; this.transformationRequest = transformationRequest; this.fallbackListener = fallbackListener; - String inputSampleMimeType = checkNotNull(inputFormat.sampleMimeType); + Pair outputMimeTypeAndHdrModeAfterFallback = + getRequestedOutputMimeTypeAndHdrModeAfterFallback(inputFormat, transformationRequest); + requestedOutputMimeType = outputMimeTypeAndHdrModeAfterFallback.first; + hdrModeAfterFallback = outputMimeTypeAndHdrModeAfterFallback.second; + } + private static Pair getRequestedOutputMimeTypeAndHdrModeAfterFallback( + Format inputFormat, TransformationRequest transformationRequest) { + String inputSampleMimeType = checkNotNull(inputFormat.sampleMimeType); + String requestedOutputMimeType; if (transformationRequest.videoMimeType != null) { requestedOutputMimeType = transformationRequest.videoMimeType; } else if (MimeTypes.isImage(inputSampleMimeType)) { @@ -362,33 +373,25 @@ 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. - boolean fallbackToMediaCodec = - 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; - } + @TransformationRequest.HdrMode int hdrMode = transformationRequest.hdrMode; + if (hdrMode == HDR_MODE_KEEP_HDR && isTransferHdr(inputFormat.colorInfo)) { + ImmutableList hdrEncoders = + getSupportedEncodersForHdrEditing(requestedOutputMimeType, inputFormat.colorInfo); + if (hdrEncoders.isEmpty()) { + @Nullable + String alternativeMimeType = MediaCodecUtil.getAlternativeCodecMimeType(inputFormat); + if (alternativeMimeType != null) { + requestedOutputMimeType = alternativeMimeType; + hdrEncoders = + getSupportedEncodersForHdrEditing(alternativeMimeType, inputFormat.colorInfo); + } + } + if (hdrEncoders.isEmpty()) { + hdrMode = HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC; + } + } - /** 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. - return ColorInfo.SDR_BT709_LIMITED; - } - if (SRGB_BT709_FULL.equals(inputFormat.colorInfo)) { - return ColorInfo.SDR_BT709_LIMITED; - } - return checkNotNull(inputFormat.colorInfo); + return Pair.create(requestedOutputMimeType, hdrMode); } public @TransformationRequest.HdrMode int getHdrModeAfterFallback() { @@ -458,6 +461,21 @@ import org.checkerframework.dataflow.qual.Pure; return encoderSurfaceInfo; } + /** Returns the {@link ColorInfo} expected from the input surface. */ + private ColorInfo getSupportedInputColor() { + boolean isInputToneMapped = + isTransferHdr(inputFormat.colorInfo) && hdrModeAfterFallback != HDR_MODE_KEEP_HDR; + 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. + return ColorInfo.SDR_BT709_LIMITED; + } + if (SRGB_BT709_FULL.equals(inputFormat.colorInfo)) { + return ColorInfo.SDR_BT709_LIMITED; + } + return checkNotNull(inputFormat.colorInfo); + } + /** * Creates a {@link TransformationRequest}, based on an original {@code TransformationRequest} * and parameters specifying alterations to it that indicate device support.