diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TransformationTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TransformationTest.java index 61b499ee46..0e9f9e7bf7 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TransformationTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TransformationTest.java @@ -21,13 +21,17 @@ import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_INCREAS import static androidx.media3.transformer.AndroidTestUtil.MP4_REMOTE_4K60_PORTRAIT_URI_STRING; import android.content.Context; +import androidx.media3.common.Format; import androidx.media3.common.util.Log; import androidx.media3.common.util.Util; +import androidx.media3.transformer.Codec; +import androidx.media3.transformer.TransformationException; import androidx.media3.transformer.TransformationRequest; import androidx.media3.transformer.Transformer; import androidx.media3.transformer.TransformerAndroidTestRunner; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; @@ -49,6 +53,46 @@ public class TransformationTest { .run(testId, MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING); } + @Test + public void transformWithDecodeEncode() throws Exception { + final String testId = TAG + "_transformForceCodecUse"; + + Context context = ApplicationProvider.getApplicationContext(); + Transformer transformer = + new Transformer.Builder(context) + .setEncoderFactory( + new Codec.EncoderFactory() { + @Override + public Codec createForAudioEncoding(Format format, List allowedMimeTypes) + throws TransformationException { + return Codec.EncoderFactory.DEFAULT.createForAudioEncoding( + format, allowedMimeTypes); + } + + @Override + public Codec createForVideoEncoding(Format format, List allowedMimeTypes) + throws TransformationException { + return Codec.EncoderFactory.DEFAULT.createForVideoEncoding( + format, allowedMimeTypes); + } + + @Override + public boolean audioNeedsEncoding() { + return true; + } + + @Override + public boolean videoNeedsEncoding() { + return true; + } + }) + .build(); + new TransformerAndroidTestRunner.Builder(context, transformer) + .setCalculateSsim(true) + .build() + .run(testId, MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING); + } + @Test public void transform4K60() throws Exception { final String testId = TAG + "_transform4K60"; 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 8bdc6e4dda..968849f44d 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/Codec.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/Codec.java @@ -107,6 +107,11 @@ public interface Codec { Codec createForVideoEncoding(Format format, List allowedMimeTypes) throws TransformationException; + /** Returns whether the audio needs to be encoded because of encoder specific configuration. */ + default boolean audioNeedsEncoding() { + return false; + } + /** Returns whether the video needs to be encoded because of encoder specific configuration. */ default boolean videoNeedsEncoding() { return false; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerAudioRenderer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerAudioRenderer.java index 312001975f..29b39076cf 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerAudioRenderer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerAudioRenderer.java @@ -85,6 +85,9 @@ import androidx.media3.extractor.metadata.mp4.SlowMotionData; } private boolean shouldPassthrough(Format inputFormat) { + if (encoderFactory.audioNeedsEncoding()) { + return false; + } if (transformationRequest.audioMimeType != null && !transformationRequest.audioMimeType.equals(inputFormat.sampleMimeType)) { return false;