From 50d4e663083ef84e50e271535dde8a7450c502fa Mon Sep 17 00:00:00 2001 From: Googler Date: Tue, 11 Feb 2025 02:57:01 -0800 Subject: [PATCH] Add getInputFormat to Codec interface PiperOrigin-RevId: 725552831 --- RELEASENOTES.md | 1 + .../transformer/ForceEndOfStreamTest.java | 5 +++ .../androidx/media3/transformer/Codec.java | 11 ++++++ .../media3/transformer/DefaultCodec.java | 10 ++++++ .../ExperimentalAnalyzerModeFactory.java | 5 +++ .../DefaultEncoderFactoryTest.java | 36 ++++++++----------- 6 files changed, 47 insertions(+), 21 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 0982886994..2de6f2acae 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -9,6 +9,7 @@ * Transformer: * Add `MediaProjectionAssetLoader`, which provides media from a `MediaProjection` for screen recording. + * Add `#getInputFormat()` to `Codec` interface. * Track Selection: * Extractors: * DataSource: diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/ForceEndOfStreamTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/ForceEndOfStreamTest.java index a4280e37fe..d13f75261e 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/ForceEndOfStreamTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/ForceEndOfStreamTest.java @@ -258,6 +258,11 @@ public class ForceEndOfStreamTest { wrappedDecoder.signalEndOfInputStream(); } + @Override + public Format getInputFormat() throws ExportException { + return wrappedDecoder.getInputFormat(); + } + @Nullable @Override public Format getOutputFormat() throws ExportException { diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/Codec.java b/libraries/transformer/src/main/java/androidx/media3/transformer/Codec.java index a6cc8f171a..0b1b818569 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/Codec.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/Codec.java @@ -182,6 +182,17 @@ public interface Codec { */ void signalEndOfInputStream() throws ExportException; + /** + * Returns the {@link Format} accepted by the codec. + * + *

This format may differ from the {@link Format} returned by {@link + * #getConfigurationFormat()}, depending on the underlying codec and configuration format + * requested. + * + * @throws ExportException If the underlying decoder or encoder encounters a problem. + */ + Format getInputFormat() throws ExportException; + /** * Returns the current output format, or {@code null} if unavailable. * diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultCodec.java b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultCodec.java index ba93c4469e..4b112d66d7 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultCodec.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultCodec.java @@ -272,6 +272,16 @@ public final class DefaultCodec implements Codec { } } + @Override + public Format getInputFormat() throws ExportException { + try { + return convertToFormat(mediaCodec.getInputFormat(), isDecoder, configurationFormat.metadata); + } catch (RuntimeException e) { + Log.d(TAG, "MediaCodec error", e); + throw createExportException(e); + } + } + @Override @Nullable public Format getOutputFormat() throws ExportException { diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/ExperimentalAnalyzerModeFactory.java b/libraries/transformer/src/main/java/androidx/media3/transformer/ExperimentalAnalyzerModeFactory.java index a043544185..0b8d50805e 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/ExperimentalAnalyzerModeFactory.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/ExperimentalAnalyzerModeFactory.java @@ -159,6 +159,11 @@ public final class ExperimentalAnalyzerModeFactory { inputStreamEnded = true; } + @Override + public Format getInputFormat() { + return configurationFormat; + } + @Override @Nullable public Format getOutputFormat() { diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/DefaultEncoderFactoryTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/DefaultEncoderFactoryTest.java index 91ae34c23c..100ad747df 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/DefaultEncoderFactoryTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/DefaultEncoderFactoryTest.java @@ -265,32 +265,26 @@ public class DefaultEncoderFactoryTest { @Test public void createForAudioEncoding_unsupportedSampleRateWithFallback() throws Exception { - Format requestedAudioFormat = createAudioFormat(MimeTypes.AUDIO_AAC, /* sampleRate= */ 192_000); + int highestSupportedSampleRate = 96_000; + int unsupportedSampleRate = 192_000; + Format requestedAudioFormat = createAudioFormat(MimeTypes.AUDIO_AAC, unsupportedSampleRate); - Format actualAudioFormat = + DefaultCodec codec = new DefaultEncoderFactory.Builder(context) .setEnableFallback(true) .build() - .createForAudioEncoding(requestedAudioFormat) - .getConfigurationFormat(); + .createForAudioEncoding(requestedAudioFormat); - assertThat(actualAudioFormat.sampleMimeType).isEqualTo(MimeTypes.AUDIO_AAC); - assertThat(actualAudioFormat.sampleRate).isEqualTo(96_000); - } - - @Test - public void createForAudioEncoding_unsupportedSampleRateWithoutFallback() throws Exception { - Format requestedAudioFormat = createAudioFormat(MimeTypes.AUDIO_AAC, /* sampleRate= */ 192_000); - - Format actualAudioFormat = - new DefaultEncoderFactory.Builder(context) - .setEnableFallback(false) - .build() - .createForAudioEncoding(requestedAudioFormat) - .getConfigurationFormat(); - - assertThat(actualAudioFormat.sampleMimeType).isEqualTo(MimeTypes.AUDIO_AAC); - assertThat(actualAudioFormat.sampleRate).isEqualTo(192_000); + Format inputFormat = codec.getInputFormat(); + Format configurationFormat = codec.getConfigurationFormat(); + Format outputFormat = codec.getOutputFormat(); + assertThat(outputFormat).isNotNull(); + assertThat(inputFormat.sampleMimeType).isEqualTo(MimeTypes.AUDIO_AAC); + assertThat(configurationFormat.sampleMimeType).isEqualTo(MimeTypes.AUDIO_AAC); + assertThat(outputFormat.sampleMimeType).isEqualTo(MimeTypes.AUDIO_AAC); + assertThat(inputFormat.sampleRate).isEqualTo(highestSupportedSampleRate); + assertThat(configurationFormat.sampleRate).isEqualTo(highestSupportedSampleRate); + assertThat(outputFormat.sampleRate).isEqualTo(highestSupportedSampleRate); } private static Format createVideoFormat(String mimeType, int width, int height, int frameRate) {