From 1c3fe2082657dd5810c1ee29f791012c198a8596 Mon Sep 17 00:00:00 2001 From: samrobinson Date: Tue, 16 Jul 2024 07:00:18 -0700 Subject: [PATCH] Handle no supported encoder & muxer mime types in the Encoder factory. PiperOrigin-RevId: 652825117 --- .../transformer/AudioSampleExporter.java | 1 + .../transformer/DefaultEncoderFactory.java | 26 +++++++++++++++++-- .../media3/transformer/SampleExporter.java | 24 +++-------------- .../transformer/VideoSampleExporter.java | 1 + 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSampleExporter.java b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSampleExporter.java index d287ce9cc9..dcffcbbae5 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSampleExporter.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSampleExporter.java @@ -78,6 +78,7 @@ import org.checkerframework.dataflow.qual.Pure; .setCodecs(firstInputFormat.codecs) .build(); + // TODO - b/324426022: Move logic for supported mime types to DefaultEncoderFactory. encoder = encoderFactory.createForAudioEncoding( requestedEncoderFormat 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 aeaafe966a..44418fcfab 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java @@ -16,6 +16,7 @@ package androidx.media3.transformer; +import static androidx.media3.common.ColorInfo.isTransferHdr; import static androidx.media3.common.util.Assertions.checkArgument; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkState; @@ -211,7 +212,9 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { if (format.bitrate == Format.NO_VALUE) { format = format.buildUpon().setAverageBitrate(DEFAULT_AUDIO_BITRATE).build(); } - checkNotNull(format.sampleMimeType); + if (format.sampleMimeType == null) { + throw createNoSupportedMimeTypeException(format, /* isVideo= */ false); + } MediaFormat mediaFormat = createMediaFormatFromFormat(format); ImmutableList mediaCodecInfos = EncoderUtil.getSupportedEncoders(format.sampleMimeType); @@ -240,13 +243,16 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { if (format.frameRate == Format.NO_VALUE || deviceNeedsDefaultFrameRateWorkaround()) { format = format.buildUpon().setFrameRate(DEFAULT_FRAME_RATE).build(); } + if (format.sampleMimeType == null) { + throw createNoSupportedMimeTypeException(format, /* isVideo= */ true); + } checkArgument(format.width != Format.NO_VALUE); checkArgument(format.height != Format.NO_VALUE); // According to interface Javadoc, format.rotationDegrees should be 0. The video should always // be encoded in landscape orientation. checkArgument(format.height <= format.width); checkArgument(format.rotationDegrees == 0); - checkNotNull(format.sampleMimeType); + checkStateNotNull(videoEncoderSelector); @Nullable @@ -704,6 +710,22 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { return (int) (width * height * frameRate * 0.07 * 2); } + private static ExportException createNoSupportedMimeTypeException( + Format format, boolean isVideo) { + String errorMessage = "No MIME type is supported by both encoder and muxer."; + int errorCode = ExportException.ERROR_CODE_ENCODING_FORMAT_UNSUPPORTED; + + if (isVideo && isTransferHdr(format.colorInfo)) { + errorMessage += " Requested HDR colorInfo: " + format.colorInfo; + } + + return ExportException.createForCodec( + new IllegalArgumentException(errorMessage), + errorCode, + new ExportException.CodecInfo( + format.toString(), isVideo, /* isDecoder= */ false, /* name= */ null)); + } + @RequiresNonNull("#1.sampleMimeType") private static ExportException createExportException(Format format, String errorString) { return ExportException.createForCodec( diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SampleExporter.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SampleExporter.java index fafbe430ef..98aa296560 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SampleExporter.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SampleExporter.java @@ -162,11 +162,11 @@ import java.util.List; * @param requestedFormat The {@link Format} requested. * @param muxerSupportedMimeTypes The list of sample {@linkplain MimeTypes MIME types} that the * muxer supports. - * @return A supported {@linkplain MimeTypes MIME type}. - * @throws ExportException If there are no supported {@linkplain MimeTypes MIME types}. + * @return A supported {@linkplain MimeTypes MIME type}, or {@code null} if none are supported. */ + @Nullable protected static String findSupportedMimeTypeForEncoderAndMuxer( - Format requestedFormat, List muxerSupportedMimeTypes) throws ExportException { + Format requestedFormat, List muxerSupportedMimeTypes) { boolean isVideo = MimeTypes.isVideo(checkNotNull(requestedFormat.sampleMimeType)); ImmutableSet.Builder mimeTypesToCheckSetBuilder = @@ -193,22 +193,6 @@ import java.util.List; } } - throw createNoSupportedMimeTypeException(requestedFormat); - } - - private static ExportException createNoSupportedMimeTypeException(Format format) { - String errorMessage = "No MIME type is supported by both encoder and muxer."; - int errorCode = ExportException.ERROR_CODE_ENCODING_FORMAT_UNSUPPORTED; - boolean isVideo = MimeTypes.isVideo(format.sampleMimeType); - - if (isVideo && isTransferHdr(format.colorInfo)) { - errorMessage += " Requested HDR colorInfo: " + format.colorInfo; - } - - return ExportException.createForCodec( - new IllegalArgumentException(errorMessage), - errorCode, - new ExportException.CodecInfo( - format.toString(), isVideo, /* isDecoder= */ false, /* name= */ null)); + return null; } } diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSampleExporter.java b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSampleExporter.java index c8e39dff95..5b2fc5a65a 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSampleExporter.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSampleExporter.java @@ -315,6 +315,7 @@ import org.checkerframework.dataflow.qual.Pure; .setCodecs(inputFormat.codecs) .build(); + // TODO - b/324426022: Move logic for supported mime types to DefaultEncoderFactory. encoder = encoderFactory.createForVideoEncoding( requestedEncoderFormat