From 5147eb1a65b91d839ebf4d4a4bbc275f40f94e72 Mon Sep 17 00:00:00 2001 From: sheenachhabra Date: Wed, 31 Jan 2024 04:57:22 -0800 Subject: [PATCH] Add audio/video sample mime type in ExportResult PiperOrigin-RevId: 603013441 --- .../transformer/TransformerEndToEndTest.java | 35 +++++++++++++++---- .../media3/transformer/ExportResult.java | 35 +++++++++++++++++++ .../media3/transformer/Transformer.java | 5 ++- 3 files changed, 68 insertions(+), 7 deletions(-) diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerEndToEndTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerEndToEndTest.java index 778aacecd9..41a54f2a22 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerEndToEndTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerEndToEndTest.java @@ -925,8 +925,8 @@ public class TransformerEndToEndTest { } @Test - public void transcode_withOutputMimeTypeAv1_completesSuccessfully() throws Exception { - String testId = "transcode_withOutputMimeTypeAv1_completesSuccessfully"; + public void transcode_withOutputVideoMimeTypeAv1_completesSuccessfully() throws Exception { + String testId = "transcode_withOutputVideoMimeTypeAv1_completesSuccessfully"; if (AndroidTestUtil.skipAndLogIfFormatsUnsupported( context, testId, @@ -943,13 +943,36 @@ public class TransformerEndToEndTest { Transformer transformer = new Transformer.Builder(context).setVideoMimeType(MimeTypes.VIDEO_AV1).build(); - ExportTestResult exportTestResult = + ExportResult exportResult = new TransformerAndroidTestRunner.Builder(context, transformer) .build() - .run(testId, editedMediaItem); + .run(testId, editedMediaItem) + .exportResult; - // TODO: b/322813915 - Assert on output mime type. - assertThat(exportTestResult.exportResult.exportException).isNull(); + // TODO: b/322954582 - Also assert by probing output file. + assertThat(exportResult.exportException).isNull(); + assertThat(exportResult.durationMs).isGreaterThan(0); + assertThat(exportResult.videoMimeType).isEqualTo(MimeTypes.VIDEO_AV1); + } + + @Test + public void transcode_withOutputAudioMimeTypeAac_completesSuccessfully() throws Exception { + String testId = "transcode_withOutputAudioMimeTypeAac_completesSuccessfully"; + MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP3_ASSET_URI_STRING)); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); + Transformer transformer = + new Transformer.Builder(context).setAudioMimeType(MimeTypes.AUDIO_AAC).build(); + + ExportResult exportResult = + new TransformerAndroidTestRunner.Builder(context, transformer) + .build() + .run(testId, editedMediaItem) + .exportResult; + + // TODO: b/322954582 - Also assert by probing output file. + assertThat(exportResult.exportException).isNull(); + assertThat(exportResult.durationMs).isGreaterThan(0); + assertThat(exportResult.audioMimeType).isEqualTo(MimeTypes.AUDIO_AAC); } private static AudioProcessor createSonic(float pitch) { diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/ExportResult.java b/libraries/transformer/src/main/java/androidx/media3/transformer/ExportResult.java index faa6122d1c..a4e159a7df 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/ExportResult.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/ExportResult.java @@ -23,6 +23,7 @@ import androidx.annotation.Nullable; import androidx.media3.common.C; import androidx.media3.common.ColorInfo; import androidx.media3.common.MediaItem; +import androidx.media3.common.MimeTypes; import androidx.media3.common.util.UnstableApi; import com.google.common.collect.ImmutableList; import com.google.errorprone.annotations.CanIgnoreReturnValue; @@ -46,12 +47,14 @@ public final class ExportResult { private int channelCount; private int sampleRate; @Nullable private String audioEncoderName; + @Nullable private String audioMimeType; private int averageVideoBitrate; @Nullable private ColorInfo colorInfo; private int height; private int width; private int videoFrameCount; @Nullable private String videoEncoderName; + @Nullable private String videoMimeType; private @OptimizationResult int optimizationResult; @Nullable private ExportException exportException; @@ -137,6 +140,13 @@ public final class ExportResult { return this; } + /** Sets the output audio {@linkplain androidx.media3.common.MimeTypes mime type}. */ + @CanIgnoreReturnValue + public Builder setAudioMimeType(@Nullable String audioMimeType) { + this.audioMimeType = audioMimeType; + return this; + } + /** * Sets the average video bitrate. * @@ -199,6 +209,13 @@ public final class ExportResult { return this; } + /** Sets the output video {@linkplain androidx.media3.common.MimeTypes mime type}. */ + @CanIgnoreReturnValue + public Builder setVideoMimeType(@Nullable String videoMimeType) { + this.videoMimeType = videoMimeType; + return this; + } + /** * Sets {@link OptimizationResult} to indicate an optimization as been successful, or has failed * and normal export proceeded instead. @@ -231,12 +248,14 @@ public final class ExportResult { channelCount, sampleRate, audioEncoderName, + audioMimeType, averageVideoBitrate, colorInfo, height, width, videoFrameCount, videoEncoderName, + videoMimeType, optimizationResult, exportException); } @@ -382,6 +401,9 @@ public final class ExportResult { /** The name of the audio encoder used, or {@code null} if none were used. */ @Nullable public final String audioEncoderName; + /** The output audio {@linkplain MimeTypes mime type}, or {@code null} if unset or unknown. */ + @Nullable public final String audioMimeType; + /** * The average bitrate of the video track data, or {@link C#RATE_UNSET_INT} if unset or unknown. */ @@ -402,6 +424,9 @@ public final class ExportResult { /** The name of the video encoder used, or {@code null} if none were used. */ @Nullable public final String videoEncoderName; + /** The output video {@linkplain MimeTypes mime type}, or {@code null} if unset or unknown. */ + @Nullable public final String videoMimeType; + /** The result of any requested optimizations. */ public final @OptimizationResult int optimizationResult; @@ -419,12 +444,14 @@ public final class ExportResult { int channelCount, int sampleRate, @Nullable String audioEncoderName, + @Nullable String audioMimeType, int averageVideoBitrate, @Nullable ColorInfo colorInfo, int height, int width, int videoFrameCount, @Nullable String videoEncoderName, + @Nullable String videoMimeType, @OptimizationResult int optimizationResult, @Nullable ExportException exportException) { this.processedInputs = processedInputs; @@ -434,12 +461,14 @@ public final class ExportResult { this.channelCount = channelCount; this.sampleRate = sampleRate; this.audioEncoderName = audioEncoderName; + this.audioMimeType = audioMimeType; this.averageVideoBitrate = averageVideoBitrate; this.colorInfo = colorInfo; this.height = height; this.width = width; this.videoFrameCount = videoFrameCount; this.videoEncoderName = videoEncoderName; + this.videoMimeType = videoMimeType; this.optimizationResult = optimizationResult; this.exportException = exportException; } @@ -453,12 +482,14 @@ public final class ExportResult { .setChannelCount(channelCount) .setSampleRate(sampleRate) .setAudioEncoderName(audioEncoderName) + .setAudioMimeType(audioMimeType) .setAverageVideoBitrate(averageVideoBitrate) .setColorInfo(colorInfo) .setHeight(height) .setWidth(width) .setVideoFrameCount(videoFrameCount) .setVideoEncoderName(videoEncoderName) + .setVideoMimeType(videoMimeType) .setOptimizationResult(optimizationResult) .setExportException(exportException); } @@ -479,12 +510,14 @@ public final class ExportResult { && channelCount == result.channelCount && sampleRate == result.sampleRate && Objects.equals(audioEncoderName, result.audioEncoderName) + && Objects.equals(audioMimeType, result.audioMimeType) && averageVideoBitrate == result.averageVideoBitrate && Objects.equals(colorInfo, result.colorInfo) && height == result.height && width == result.width && videoFrameCount == result.videoFrameCount && Objects.equals(videoEncoderName, result.videoEncoderName) + && Objects.equals(videoMimeType, result.videoMimeType) && optimizationResult == result.optimizationResult && Objects.equals(exportException, result.exportException); } @@ -498,12 +531,14 @@ public final class ExportResult { result = 31 * result + channelCount; result = 31 * result + sampleRate; result = 31 * result + Objects.hashCode(audioEncoderName); + result = 31 * result + Objects.hashCode(audioMimeType); result = 31 * result + averageVideoBitrate; result = 31 * result + Objects.hashCode(colorInfo); result = 31 * result + height; result = 31 * result + width; result = 31 * result + videoFrameCount; result = 31 * result + Objects.hashCode(videoEncoderName); + result = 31 * result + Objects.hashCode(videoMimeType); result = 31 * result + optimizationResult; result = 31 * result + Objects.hashCode(exportException); return result; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java index 887e73e65f..4dd11a30fe 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java @@ -1643,7 +1643,9 @@ public final class Transformer { public void onTrackEnded( @C.TrackType int trackType, Format format, int averageBitrate, int sampleCount) { if (trackType == C.TRACK_TYPE_AUDIO) { - exportResultBuilder.setAverageAudioBitrate(averageBitrate); + exportResultBuilder + .setAudioMimeType(format.sampleMimeType) + .setAverageAudioBitrate(averageBitrate); if (format.channelCount != Format.NO_VALUE) { exportResultBuilder.setChannelCount(format.channelCount); } @@ -1652,6 +1654,7 @@ public final class Transformer { } } else if (trackType == C.TRACK_TYPE_VIDEO) { exportResultBuilder + .setVideoMimeType(format.sampleMimeType) .setAverageVideoBitrate(averageBitrate) .setColorInfo(format.colorInfo) .setVideoFrameCount(sampleCount);