Define TestMuxer Factory and Holder as inner classes.

PiperOrigin-RevId: 552469061
This commit is contained in:
samrobinson 2023-07-31 15:04:58 +01:00 committed by Rohit Singh
parent c16840573b
commit 9e975b25d1
5 changed files with 158 additions and 176 deletions

View File

@ -33,7 +33,6 @@ import android.content.Context;
import androidx.media3.common.MediaItem; import androidx.media3.common.MediaItem;
import androidx.media3.common.util.Util; import androidx.media3.common.util.Util;
import androidx.media3.test.utils.DumpFileAsserts; import androidx.media3.test.utils.DumpFileAsserts;
import androidx.media3.transformer.TestUtil.TestMuxerFactory.TestMuxerHolder;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
@ -53,13 +52,13 @@ public class CompositionExportTest {
private Context context; private Context context;
private String outputPath; private String outputPath;
private TestMuxerHolder testMuxerHolder; private TestMuxer.Holder muxerHolder;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
context = ApplicationProvider.getApplicationContext(); context = ApplicationProvider.getApplicationContext();
outputPath = Util.createTempFile(context, "TransformerTest").getPath(); outputPath = Util.createTempFile(context, "TransformerTest").getPath();
testMuxerHolder = new TestMuxerHolder(); muxerHolder = new TestMuxer.Holder();
createEncodersAndDecoders(); createEncodersAndDecoders();
} }
@ -73,7 +72,7 @@ public class CompositionExportTest {
public void start_audioVideoTransmuxedFromDifferentSequences_producesExpectedResult() public void start_audioVideoTransmuxedFromDifferentSequences_producesExpectedResult()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.start(mediaItem, outputPath); transformer.start(mediaItem, outputPath);
ExportResult expectedExportResult = TransformerTestRunner.runLooper(transformer); ExportResult expectedExportResult = TransformerTestRunner.runLooper(transformer);
@ -105,7 +104,7 @@ public class CompositionExportTest {
@Test @Test
public void start_loopingTransmuxedAudio_producesExpectedResult() throws Exception { public void start_loopingTransmuxedAudio_producesExpectedResult() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
EditedMediaItem audioEditedMediaItem = EditedMediaItem audioEditedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_ONLY)).build(); new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_ONLY)).build();
EditedMediaItemSequence audioSequence = EditedMediaItemSequence audioSequence =
@ -135,7 +134,7 @@ public class CompositionExportTest {
@Test @Test
public void start_loopingTransmuxedVideo_producesExpectedResult() throws Exception { public void start_loopingTransmuxedVideo_producesExpectedResult() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
EditedMediaItem audioEditedMediaItem = EditedMediaItem audioEditedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_ONLY)).build(); new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_ONLY)).build();
EditedMediaItemSequence audioSequence = EditedMediaItemSequence audioSequence =
@ -165,7 +164,7 @@ public class CompositionExportTest {
@Test @Test
public void start_loopingRawAudio_producesExpectedResult() throws Exception { public void start_loopingRawAudio_producesExpectedResult() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
EditedMediaItemSequence audioSequence = EditedMediaItemSequence audioSequence =
new EditedMediaItemSequence( new EditedMediaItemSequence(
ImmutableList.of( ImmutableList.of(
@ -198,7 +197,7 @@ public class CompositionExportTest {
@Test @Test
public void start_compositionOfConcurrentAudio_isCorrect() throws Exception { public void start_compositionOfConcurrentAudio_isCorrect() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
EditedMediaItem rawAudioItem = EditedMediaItem rawAudioItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build(); new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build();
@ -215,15 +214,13 @@ public class CompositionExportTest {
assertThat(exportResult.processedInputs).hasSize(2); assertThat(exportResult.processedInputs).hasSize(2);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_AUDIO_RAW + ".concurrent"));
checkNotNull(testMuxerHolder.testMuxer),
getDumpFileName(FILE_AUDIO_RAW + ".concurrent"));
} }
@Test @Test
public void start_audioVideoCompositionWithExtraAudio_isCorrect() throws Exception { public void start_audioVideoCompositionWithExtraAudio_isCorrect() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
EditedMediaItem audioVideoItem = EditedMediaItem audioVideoItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO)) new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO))
.build(); .build();
@ -250,7 +247,7 @@ public class CompositionExportTest {
@Test @Test
public void start_audioVideoCompositionWithLoopingAudio_isCorrect() throws Exception { public void start_audioVideoCompositionWithLoopingAudio_isCorrect() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
EditedMediaItem audioVideoItem = EditedMediaItem audioVideoItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO)) new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO))
.build(); .build();

View File

@ -73,8 +73,6 @@ import androidx.media3.extractor.PositionHolder;
import androidx.media3.test.utils.DumpFileAsserts; import androidx.media3.test.utils.DumpFileAsserts;
import androidx.media3.test.utils.FakeClock; import androidx.media3.test.utils.FakeClock;
import androidx.media3.transformer.TestUtil.FakeAssetLoader; import androidx.media3.transformer.TestUtil.FakeAssetLoader;
import androidx.media3.transformer.TestUtil.TestMuxerFactory;
import androidx.media3.transformer.TestUtil.TestMuxerFactory.TestMuxerHolder;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
@ -105,7 +103,7 @@ public final class MediaItemExportTest {
private Context context; private Context context;
private String outputPath; private String outputPath;
private TestMuxerHolder testMuxerHolder; private TestMuxer.Holder muxerHolder;
private ProgressHolder progressHolder; private ProgressHolder progressHolder;
private ArgumentCaptor<Composition> compositionArgumentCaptor; private ArgumentCaptor<Composition> compositionArgumentCaptor;
@ -113,7 +111,7 @@ public final class MediaItemExportTest {
public void setUp() throws Exception { public void setUp() throws Exception {
context = ApplicationProvider.getApplicationContext(); context = ApplicationProvider.getApplicationContext();
outputPath = Util.createTempFile(context, "TransformerTest").getPath(); outputPath = Util.createTempFile(context, "TransformerTest").getPath();
testMuxerHolder = new TestMuxerHolder(); muxerHolder = new TestMuxer.Holder();
progressHolder = new ProgressHolder(); progressHolder = new ProgressHolder();
compositionArgumentCaptor = ArgumentCaptor.forClass(Composition.class); compositionArgumentCaptor = ArgumentCaptor.forClass(Composition.class);
createEncodersAndDecoders(); createEncodersAndDecoders();
@ -128,20 +126,20 @@ public final class MediaItemExportTest {
@Test @Test
public void start_videoOnlyPassthrough_completesSuccessfully() throws Exception { public void start_videoOnlyPassthrough_completesSuccessfully() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
transformer.start(mediaItem, outputPath); transformer.start(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer); TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, checkNotNull(testMuxerHolder.testMuxer), getDumpFileName(FILE_VIDEO_ONLY)); context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_VIDEO_ONLY));
} }
@Test @Test
public void start_audioOnlyPassthrough_completesSuccessfully() throws Exception { public void start_audioOnlyPassthrough_completesSuccessfully() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER);
transformer.start(mediaItem, outputPath); transformer.start(mediaItem, outputPath);
@ -149,14 +147,14 @@ public final class MediaItemExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_UNSUPPORTED_BY_ENCODER)); getDumpFileName(FILE_AUDIO_UNSUPPORTED_BY_ENCODER));
} }
@Test @Test
public void start_audioOnlyTranscoding_completesSuccessfully() throws Exception { public void start_audioOnlyTranscoding_completesSuccessfully() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false) createTransformerBuilder(muxerHolder, /* enableFallback= */ false)
.setAudioMimeType(MimeTypes.AUDIO_AAC) // supported by encoder and muxer .setAudioMimeType(MimeTypes.AUDIO_AAC) // supported by encoder and muxer
.build(); .build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW);
@ -165,27 +163,27 @@ public final class MediaItemExportTest {
TransformerTestRunner.runLooper(transformer); TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, checkNotNull(testMuxerHolder.testMuxer), getDumpFileName(FILE_AUDIO_RAW + ".aac")); context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_AUDIO_RAW + ".aac"));
} }
@Test @Test
public void start_audioAndVideo_completesSuccessfully() throws Exception { public void start_audioAndVideo_completesSuccessfully() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.start(mediaItem, outputPath); transformer.start(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer); TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, checkNotNull(testMuxerHolder.testMuxer), getDumpFileName(FILE_AUDIO_VIDEO)); context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_AUDIO_VIDEO));
} }
@Test @Test
public void start_audioAndVideo_withClippingStartAtKeyFrame_completesSuccessfully() public void start_audioAndVideo_withClippingStartAtKeyFrame_completesSuccessfully()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem mediaItem =
new MediaItem.Builder() new MediaItem.Builder()
.setUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO_INCREASING_TIMESTAMPS_15S) .setUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO_INCREASING_TIMESTAMPS_15S)
@ -202,14 +200,14 @@ public final class MediaItemExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_VIDEO_INCREASING_TIMESTAMPS_15S + ".clipped")); getDumpFileName(FILE_AUDIO_VIDEO_INCREASING_TIMESTAMPS_15S + ".clipped"));
} }
@Test @Test
public void start_withSubtitles_completesSuccessfully() throws Exception { public void start_withSubtitles_completesSuccessfully() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false) createTransformerBuilder(muxerHolder, /* enableFallback= */ false)
.setAudioMimeType(MimeTypes.AUDIO_AAC) .setAudioMimeType(MimeTypes.AUDIO_AAC)
.build(); .build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SUBTITLES); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SUBTITLES);
@ -218,13 +216,13 @@ public final class MediaItemExportTest {
TransformerTestRunner.runLooper(transformer); TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, checkNotNull(testMuxerHolder.testMuxer), getDumpFileName(FILE_WITH_SUBTITLES)); context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_WITH_SUBTITLES));
} }
@Test @Test
public void start_successiveExports_completesSuccessfully() throws Exception { public void start_successiveExports_completesSuccessfully() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
// Transform first media item. // Transform first media item.
@ -237,13 +235,13 @@ public final class MediaItemExportTest {
TransformerTestRunner.runLooper(transformer); TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, checkNotNull(testMuxerHolder.testMuxer), getDumpFileName(FILE_AUDIO_VIDEO)); context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_AUDIO_VIDEO));
} }
@Test @Test
public void start_concurrentExports_throwsError() { public void start_concurrentExports_throwsError() {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
transformer.start(mediaItem, outputPath); transformer.start(mediaItem, outputPath);
@ -254,7 +252,7 @@ public final class MediaItemExportTest {
@Test @Test
public void start_removeAudio_completesSuccessfully() throws Exception { public void start_removeAudio_completesSuccessfully() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
EditedMediaItem editedMediaItem = EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)) new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO))
.setRemoveAudio(true) .setRemoveAudio(true)
@ -264,15 +262,13 @@ public final class MediaItemExportTest {
TransformerTestRunner.runLooper(transformer); TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_AUDIO_VIDEO + ".noaudio"));
checkNotNull(testMuxerHolder.testMuxer),
getDumpFileName(FILE_AUDIO_VIDEO + ".noaudio"));
} }
@Test @Test
public void start_removeVideo_completesSuccessfully() throws Exception { public void start_removeVideo_completesSuccessfully() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
EditedMediaItem editedMediaItem = EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)) new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO))
.setRemoveVideo(true) .setRemoveVideo(true)
@ -282,15 +278,13 @@ public final class MediaItemExportTest {
TransformerTestRunner.runLooper(transformer); TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_AUDIO_VIDEO + ".novideo"));
checkNotNull(testMuxerHolder.testMuxer),
getDumpFileName(FILE_AUDIO_VIDEO + ".novideo"));
} }
@Test @Test
public void start_forceAudioTrackOnAudioOnly_isIgnored() throws Exception { public void start_forceAudioTrackOnAudioOnly_isIgnored() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
EditedMediaItemSequence sequence = EditedMediaItemSequence sequence =
@ -305,14 +299,14 @@ public final class MediaItemExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_UNSUPPORTED_BY_ENCODER)); getDumpFileName(FILE_AUDIO_UNSUPPORTED_BY_ENCODER));
} }
@Test @Test
public void start_forceAudioTrackOnAudioVideo_isIgnored() throws Exception { public void start_forceAudioTrackOnAudioVideo_isIgnored() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
EditedMediaItemSequence sequence = EditedMediaItemSequence sequence =
@ -326,13 +320,13 @@ public final class MediaItemExportTest {
TransformerTestRunner.runLooper(transformer); TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, checkNotNull(testMuxerHolder.testMuxer), getDumpFileName(FILE_AUDIO_VIDEO)); context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_AUDIO_VIDEO));
} }
@Test @Test
public void start_forceAudioTrackAndRemoveAudio_generatesSilentAudio() throws Exception { public void start_forceAudioTrackAndRemoveAudio_generatesSilentAudio() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
EditedMediaItem editedMediaItem = EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)) new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO))
.setRemoveAudio(true) .setRemoveAudio(true)
@ -349,7 +343,7 @@ public final class MediaItemExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_VIDEO + ".silentaudio")); getDumpFileName(FILE_AUDIO_VIDEO + ".silentaudio"));
} }
@ -357,7 +351,7 @@ public final class MediaItemExportTest {
public void start_forceAudioTrackAndRemoveAudioWithEffects_generatesSilentAudio() public void start_forceAudioTrackAndRemoveAudioWithEffects_generatesSilentAudio()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
SonicAudioProcessor sonicAudioProcessor = new SonicAudioProcessor(); SonicAudioProcessor sonicAudioProcessor = new SonicAudioProcessor();
sonicAudioProcessor.setOutputSampleRateHz(48000); sonicAudioProcessor.setOutputSampleRateHz(48000);
EditedMediaItem editedMediaItem = EditedMediaItem editedMediaItem =
@ -377,14 +371,14 @@ public final class MediaItemExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_VIDEO + ".silentaudio_48000hz")); getDumpFileName(FILE_AUDIO_VIDEO + ".silentaudio_48000hz"));
} }
@Test @Test
public void start_forceAudioTrackAndRemoveVideo_isIgnored() throws Exception { public void start_forceAudioTrackAndRemoveVideo_isIgnored() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
EditedMediaItem editedMediaItem = EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)) new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO))
.setRemoveVideo(true) .setRemoveVideo(true)
@ -399,15 +393,13 @@ public final class MediaItemExportTest {
transformer.start(composition, outputPath); transformer.start(composition, outputPath);
TransformerTestRunner.runLooper(transformer); TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_AUDIO_VIDEO + ".novideo"));
checkNotNull(testMuxerHolder.testMuxer),
getDumpFileName(FILE_AUDIO_VIDEO + ".novideo"));
} }
@Test @Test
public void start_forceAudioTrackOnVideoOnly_generatesSilentAudio() throws Exception { public void start_forceAudioTrackOnVideoOnly_generatesSilentAudio() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
EditedMediaItemSequence sequence = EditedMediaItemSequence sequence =
@ -422,7 +414,7 @@ public final class MediaItemExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_VIDEO_ONLY + ".silentaudio")); getDumpFileName(FILE_VIDEO_ONLY + ".silentaudio"));
} }
@ -431,7 +423,7 @@ public final class MediaItemExportTest {
SonicAudioProcessor sonicAudioProcessor = new SonicAudioProcessor(); SonicAudioProcessor sonicAudioProcessor = new SonicAudioProcessor();
sonicAudioProcessor.setOutputSampleRateHz(48000); sonicAudioProcessor.setOutputSampleRateHz(48000);
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
ImmutableList<AudioProcessor> audioProcessors = ImmutableList.of(sonicAudioProcessor); ImmutableList<AudioProcessor> audioProcessors = ImmutableList.of(sonicAudioProcessor);
Effects effects = new Effects(audioProcessors, /* videoEffects= */ ImmutableList.of()); Effects effects = new Effects(audioProcessors, /* videoEffects= */ ImmutableList.of());
@ -442,9 +434,7 @@ public final class MediaItemExportTest {
TransformerTestRunner.runLooper(transformer); TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_AUDIO_VIDEO + ".48000hz"));
checkNotNull(testMuxerHolder.testMuxer),
getDumpFileName(FILE_AUDIO_VIDEO + ".48000hz"));
} }
@Test @Test
@ -452,7 +442,7 @@ public final class MediaItemExportTest {
SonicAudioProcessor sonicAudioProcessor = new SonicAudioProcessor(); SonicAudioProcessor sonicAudioProcessor = new SonicAudioProcessor();
sonicAudioProcessor.setOutputSampleRateHz(48000); sonicAudioProcessor.setOutputSampleRateHz(48000);
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
ImmutableList<AudioProcessor> audioProcessors = ImmutableList.of(sonicAudioProcessor); ImmutableList<AudioProcessor> audioProcessors = ImmutableList.of(sonicAudioProcessor);
Effects effects = new Effects(audioProcessors, /* videoEffects= */ ImmutableList.of()); Effects effects = new Effects(audioProcessors, /* videoEffects= */ ImmutableList.of());
@ -469,9 +459,7 @@ public final class MediaItemExportTest {
TransformerTestRunner.runLooper(transformer); TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_AUDIO_VIDEO + ".48000hz"));
checkNotNull(testMuxerHolder.testMuxer),
getDumpFileName(FILE_AUDIO_VIDEO + ".48000hz"));
} }
@Test @Test
@ -480,7 +468,7 @@ public final class MediaItemExportTest {
Transformer.Listener mockListener2 = mock(Transformer.Listener.class); Transformer.Listener mockListener2 = mock(Transformer.Listener.class);
Transformer.Listener mockListener3 = mock(Transformer.Listener.class); Transformer.Listener mockListener3 = mock(Transformer.Listener.class);
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false) createTransformerBuilder(muxerHolder, /* enableFallback= */ false)
.addListener(mockListener1) .addListener(mockListener1)
.addListener(mockListener2) .addListener(mockListener2)
.addListener(mockListener3) .addListener(mockListener3)
@ -502,7 +490,7 @@ public final class MediaItemExportTest {
Transformer.Listener mockListener2 = mock(Transformer.Listener.class); Transformer.Listener mockListener2 = mock(Transformer.Listener.class);
Transformer.Listener mockListener3 = mock(Transformer.Listener.class); Transformer.Listener mockListener3 = mock(Transformer.Listener.class);
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false) createTransformerBuilder(muxerHolder, /* enableFallback= */ false)
.addListener(mockListener1) .addListener(mockListener1)
.addListener(mockListener2) .addListener(mockListener2)
.addListener(mockListener3) .addListener(mockListener3)
@ -530,7 +518,7 @@ public final class MediaItemExportTest {
TransformationRequest fallbackTransformationRequest = TransformationRequest fallbackTransformationRequest =
new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build(); new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build();
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ true) createTransformerBuilder(muxerHolder, /* enableFallback= */ true)
.addListener(mockListener1) .addListener(mockListener1)
.addListener(mockListener2) .addListener(mockListener2)
.addListener(mockListener3) .addListener(mockListener3)
@ -559,7 +547,7 @@ public final class MediaItemExportTest {
AtomicBoolean deprecatedFallbackCalled1 = new AtomicBoolean(); AtomicBoolean deprecatedFallbackCalled1 = new AtomicBoolean();
AtomicBoolean deprecatedFallbackCalled2 = new AtomicBoolean(); AtomicBoolean deprecatedFallbackCalled2 = new AtomicBoolean();
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false) createTransformerBuilder(muxerHolder, /* enableFallback= */ false)
.addListener( .addListener(
new Transformer.Listener() { new Transformer.Listener() {
@Override @Override
@ -591,7 +579,7 @@ public final class MediaItemExportTest {
AtomicBoolean deprecatedFallbackCalled2 = new AtomicBoolean(); AtomicBoolean deprecatedFallbackCalled2 = new AtomicBoolean();
AtomicBoolean deprecatedFallbackCalled3 = new AtomicBoolean(); AtomicBoolean deprecatedFallbackCalled3 = new AtomicBoolean();
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false) createTransformerBuilder(muxerHolder, /* enableFallback= */ false)
.addListener( .addListener(
new Transformer.Listener() { new Transformer.Listener() {
@Override @Override
@ -636,7 +624,7 @@ public final class MediaItemExportTest {
public void start_withFallback_callsDeprecatedFallbackCallbacks() throws Exception { public void start_withFallback_callsDeprecatedFallbackCallbacks() throws Exception {
AtomicBoolean deprecatedFallbackCalled = new AtomicBoolean(); AtomicBoolean deprecatedFallbackCalled = new AtomicBoolean();
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ true) createTransformerBuilder(muxerHolder, /* enableFallback= */ true)
.addListener( .addListener(
new Transformer.Listener() { new Transformer.Listener() {
@Override @Override
@ -663,7 +651,7 @@ public final class MediaItemExportTest {
Transformer.Listener mockListener2 = mock(Transformer.Listener.class); Transformer.Listener mockListener2 = mock(Transformer.Listener.class);
Transformer.Listener mockListener3 = mock(Transformer.Listener.class); Transformer.Listener mockListener3 = mock(Transformer.Listener.class);
Transformer transformer1 = Transformer transformer1 =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false) createTransformerBuilder(muxerHolder, /* enableFallback= */ false)
.addListener(mockListener1) .addListener(mockListener1)
.addListener(mockListener2) .addListener(mockListener2)
.addListener(mockListener3) .addListener(mockListener3)
@ -682,7 +670,7 @@ public final class MediaItemExportTest {
@Test @Test
public void start_flattenForSlowMotion_completesSuccessfully() throws Exception { public void start_flattenForSlowMotion_completesSuccessfully() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
EditedMediaItem editedMediaItem = EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SEF_SLOW_MOTION)) new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SEF_SLOW_MOTION))
.setFlattenForSlowMotion(true) .setFlattenForSlowMotion(true)
@ -692,15 +680,13 @@ public final class MediaItemExportTest {
TransformerTestRunner.runLooper(transformer); TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_WITH_SEF_SLOW_MOTION));
checkNotNull(testMuxerHolder.testMuxer),
getDumpFileName(FILE_WITH_SEF_SLOW_MOTION));
} }
@Test @Test
public void start_completesWithValidBitrate() throws Exception { public void start_completesWithValidBitrate() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.start(mediaItem, outputPath); transformer.start(mediaItem, outputPath);
@ -713,7 +699,7 @@ public final class MediaItemExportTest {
@Test @Test
public void start_withAudioEncoderFormatUnsupported_completesWithError() { public void start_withAudioEncoderFormatUnsupported_completesWithError() {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false) createTransformerBuilder(muxerHolder, /* enableFallback= */ false)
.setAudioMimeType(MimeTypes.AUDIO_AMR_NB) // unsupported by encoder, supported by muxer .setAudioMimeType(MimeTypes.AUDIO_AMR_NB) // unsupported by encoder, supported by muxer
.build(); .build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
@ -729,7 +715,7 @@ public final class MediaItemExportTest {
@Test @Test
public void start_withAudioDecoderFormatUnsupported_completesWithError() { public void start_withAudioDecoderFormatUnsupported_completesWithError() {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false) createTransformerBuilder(muxerHolder, /* enableFallback= */ false)
.setAudioMimeType(MimeTypes.AUDIO_AAC) // supported by encoder and muxer .setAudioMimeType(MimeTypes.AUDIO_AAC) // supported by encoder and muxer
.build(); .build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER);
@ -745,7 +731,7 @@ public final class MediaItemExportTest {
@Test @Test
public void start_withIoError_completesWithError() { public void start_withIoError_completesWithError() {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri("asset:///non-existing-path.mp4"); MediaItem mediaItem = MediaItem.fromUri("asset:///non-existing-path.mp4");
transformer.start(mediaItem, outputPath); transformer.start(mediaItem, outputPath);
@ -764,7 +750,7 @@ public final class MediaItemExportTest {
TransformationRequest fallbackTransformationRequest = TransformationRequest fallbackTransformationRequest =
new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build(); new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build();
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false) createTransformerBuilder(muxerHolder, /* enableFallback= */ false)
.addListener(mockListener) .addListener(mockListener)
.build(); .build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
@ -774,7 +760,7 @@ public final class MediaItemExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_UNSUPPORTED_BY_MUXER + ".fallback")); getDumpFileName(FILE_AUDIO_UNSUPPORTED_BY_MUXER + ".fallback"));
verify(mockListener) verify(mockListener)
.onFallbackApplied( .onFallbackApplied(
@ -791,7 +777,7 @@ public final class MediaItemExportTest {
TransformationRequest fallbackTransformationRequest = TransformationRequest fallbackTransformationRequest =
new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build(); new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build();
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ true) createTransformerBuilder(muxerHolder, /* enableFallback= */ true)
.addListener(mockListener) .addListener(mockListener)
.build(); .build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
@ -801,7 +787,7 @@ public final class MediaItemExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_UNSUPPORTED_BY_MUXER + ".fallback")); getDumpFileName(FILE_AUDIO_UNSUPPORTED_BY_MUXER + ".fallback"));
verify(mockListener) verify(mockListener)
.onFallbackApplied( .onFallbackApplied(
@ -824,9 +810,9 @@ public final class MediaItemExportTest {
new FakeClock(/* isAutoAdvancing= */ true), new FakeClock(/* isAutoAdvancing= */ true),
mediaSourceFactory); mediaSourceFactory);
Muxer.Factory muxerFactory = Muxer.Factory muxerFactory =
new TestMuxerFactory(testMuxerHolder, /* maxDelayBetweenSamplesMs= */ 1); new TestMuxer.Factory(muxerHolder, /* maxDelayBetweenSamplesMs= */ 1);
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false) createTransformerBuilder(muxerHolder, /* enableFallback= */ false)
.setAssetLoaderFactory(assetLoaderFactory) .setAssetLoaderFactory(assetLoaderFactory)
.setMuxerFactory(muxerFactory) .setMuxerFactory(muxerFactory)
.build(); .build();
@ -842,9 +828,9 @@ public final class MediaItemExportTest {
@Test @Test
public void start_withUnsetMaxDelayBetweenSamples_completesSuccessfully() throws Exception { public void start_withUnsetMaxDelayBetweenSamples_completesSuccessfully() throws Exception {
Muxer.Factory muxerFactory = Muxer.Factory muxerFactory =
new TestMuxerFactory(testMuxerHolder, /* maxDelayBetweenSamplesMs= */ C.TIME_UNSET); new TestMuxer.Factory(muxerHolder, /* maxDelayBetweenSamplesMs= */ C.TIME_UNSET);
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false) createTransformerBuilder(muxerHolder, /* enableFallback= */ false)
.setMuxerFactory(muxerFactory) .setMuxerFactory(muxerFactory)
.build(); .build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
@ -853,13 +839,13 @@ public final class MediaItemExportTest {
TransformerTestRunner.runLooper(transformer); TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, checkNotNull(testMuxerHolder.testMuxer), getDumpFileName(FILE_AUDIO_VIDEO)); context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_AUDIO_VIDEO));
} }
@Test @Test
public void start_afterCancellation_completesSuccessfully() throws Exception { public void start_afterCancellation_completesSuccessfully() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.start(mediaItem, outputPath); transformer.start(mediaItem, outputPath);
@ -880,7 +866,7 @@ public final class MediaItemExportTest {
anotherThread.start(); anotherThread.start();
Looper looper = anotherThread.getLooper(); Looper looper = anotherThread.getLooper();
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false) createTransformerBuilder(muxerHolder, /* enableFallback= */ false)
.setLooper(looper) .setLooper(looper)
.build(); .build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
@ -903,13 +889,13 @@ public final class MediaItemExportTest {
assertThat(exception.get()).isNull(); assertThat(exception.get()).isNull();
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, checkNotNull(testMuxerHolder.testMuxer), getDumpFileName(FILE_AUDIO_VIDEO)); context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_AUDIO_VIDEO));
} }
@Test @Test
public void start_fromWrongThread_throwsError() throws Exception { public void start_fromWrongThread_throwsError() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
HandlerThread anotherThread = new HandlerThread("AnotherThread"); HandlerThread anotherThread = new HandlerThread("AnotherThread");
AtomicReference<IllegalStateException> illegalStateException = new AtomicReference<>(); AtomicReference<IllegalStateException> illegalStateException = new AtomicReference<>();
@ -936,7 +922,7 @@ public final class MediaItemExportTest {
public void start_withAssetLoaderAlwaysDecoding_exporterExpectsDecoded() throws Exception { public void start_withAssetLoaderAlwaysDecoding_exporterExpectsDecoded() throws Exception {
AtomicReference<SampleConsumer> sampleConsumerRef = new AtomicReference<>(); AtomicReference<SampleConsumer> sampleConsumerRef = new AtomicReference<>();
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false) createTransformerBuilder(muxerHolder, /* enableFallback= */ false)
.setAssetLoaderFactory( .setAssetLoaderFactory(
new FakeAssetLoader.Factory(SUPPORTED_OUTPUT_TYPE_DECODED, sampleConsumerRef)) new FakeAssetLoader.Factory(SUPPORTED_OUTPUT_TYPE_DECODED, sampleConsumerRef))
.build(); .build();
@ -951,7 +937,7 @@ public final class MediaItemExportTest {
@Test @Test
public void start_withAssetLoaderNotDecodingAndDecodingNeeded_completesWithError() { public void start_withAssetLoaderNotDecodingAndDecodingNeeded_completesWithError() {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false) createTransformerBuilder(muxerHolder, /* enableFallback= */ false)
.setAssetLoaderFactory( .setAssetLoaderFactory(
new FakeAssetLoader.Factory( new FakeAssetLoader.Factory(
SUPPORTED_OUTPUT_TYPE_ENCODED, /* sampleConsumerRef= */ null)) SUPPORTED_OUTPUT_TYPE_ENCODED, /* sampleConsumerRef= */ null))
@ -972,7 +958,7 @@ public final class MediaItemExportTest {
@Test @Test
public void start_withNoOpEffects_transmuxes() throws Exception { public void start_withNoOpEffects_transmuxes() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
int mediaItemHeightPixels = 720; int mediaItemHeightPixels = 720;
ImmutableList<Effect> videoEffects = ImmutableList<Effect> videoEffects =
@ -988,13 +974,13 @@ public final class MediaItemExportTest {
// Video transcoding in unit tests is not supported. // Video transcoding in unit tests is not supported.
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, checkNotNull(testMuxerHolder.testMuxer), getDumpFileName(FILE_VIDEO_ONLY)); context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_VIDEO_ONLY));
} }
@Test @Test
public void start_withOnlyRegularRotationEffect_transmuxesAndRotates() throws Exception { public void start_withOnlyRegularRotationEffect_transmuxesAndRotates() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
ImmutableList<Effect> videoEffects = ImmutableList<Effect> videoEffects =
ImmutableList.of( ImmutableList.of(
@ -1008,15 +994,13 @@ public final class MediaItemExportTest {
// Video transcoding in unit tests is not supported. // Video transcoding in unit tests is not supported.
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context, checkNotNull(muxerHolder.muxer), getDumpFileName(FILE_AUDIO_VIDEO + ".rotated"));
checkNotNull(testMuxerHolder.testMuxer),
getDumpFileName(FILE_AUDIO_VIDEO + ".rotated"));
} }
@Test @Test
public void getProgress_knownDuration_returnsConsistentStates() throws Exception { public void getProgress_knownDuration_returnsConsistentStates() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
AtomicInteger previousProgressState = AtomicInteger previousProgressState =
new AtomicInteger(PROGRESS_STATE_WAITING_FOR_AVAILABILITY); new AtomicInteger(PROGRESS_STATE_WAITING_FOR_AVAILABILITY);
@ -1063,7 +1047,7 @@ public final class MediaItemExportTest {
@Test @Test
public void getProgress_knownDuration_givesIncreasingPercentages() throws Exception { public void getProgress_knownDuration_givesIncreasingPercentages() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
List<Integer> progresses = new ArrayList<>(); List<Integer> progresses = new ArrayList<>();
Handler progressHandler = Handler progressHandler =
@ -1098,7 +1082,7 @@ public final class MediaItemExportTest {
@Test @Test
public void getProgress_noCurrentExport_returnsNotStarted() throws Exception { public void getProgress_noCurrentExport_returnsNotStarted() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
@Transformer.ProgressState int stateBeforeTransform = transformer.getProgress(progressHolder); @Transformer.ProgressState int stateBeforeTransform = transformer.getProgress(progressHolder);
@ -1113,7 +1097,7 @@ public final class MediaItemExportTest {
@Test @Test
public void getProgress_unknownDuration_returnsConsistentStates() throws Exception { public void getProgress_unknownDuration_returnsConsistentStates() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_UNKNOWN_DURATION); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_UNKNOWN_DURATION);
AtomicInteger previousProgressState = AtomicInteger previousProgressState =
new AtomicInteger(PROGRESS_STATE_WAITING_FOR_AVAILABILITY); new AtomicInteger(PROGRESS_STATE_WAITING_FOR_AVAILABILITY);
@ -1157,7 +1141,7 @@ public final class MediaItemExportTest {
@Test @Test
public void getProgress_fromWrongThread_throwsError() throws Exception { public void getProgress_fromWrongThread_throwsError() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
HandlerThread anotherThread = new HandlerThread("AnotherThread"); HandlerThread anotherThread = new HandlerThread("AnotherThread");
AtomicReference<IllegalStateException> illegalStateException = new AtomicReference<>(); AtomicReference<IllegalStateException> illegalStateException = new AtomicReference<>();
CountDownLatch countDownLatch = new CountDownLatch(1); CountDownLatch countDownLatch = new CountDownLatch(1);
@ -1182,7 +1166,7 @@ public final class MediaItemExportTest {
@Test @Test
public void cancel_afterCompletion_doesNotThrow() throws Exception { public void cancel_afterCompletion_doesNotThrow() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
transformer.start(mediaItem, outputPath); transformer.start(mediaItem, outputPath);
@ -1193,7 +1177,7 @@ public final class MediaItemExportTest {
@Test @Test
public void cancel_fromWrongThread_throwsError() throws Exception { public void cancel_fromWrongThread_throwsError() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
HandlerThread anotherThread = new HandlerThread("AnotherThread"); HandlerThread anotherThread = new HandlerThread("AnotherThread");
AtomicReference<IllegalStateException> illegalStateException = new AtomicReference<>(); AtomicReference<IllegalStateException> illegalStateException = new AtomicReference<>();
CountDownLatch countDownLatch = new CountDownLatch(1); CountDownLatch countDownLatch = new CountDownLatch(1);

View File

@ -36,7 +36,6 @@ import androidx.media3.common.audio.SonicAudioProcessor;
import androidx.media3.common.util.Util; import androidx.media3.common.util.Util;
import androidx.media3.effect.RgbFilter; import androidx.media3.effect.RgbFilter;
import androidx.media3.test.utils.DumpFileAsserts; import androidx.media3.test.utils.DumpFileAsserts;
import androidx.media3.transformer.TestUtil.TestMuxerFactory.TestMuxerHolder;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
@ -63,13 +62,13 @@ public final class SequenceExportTest {
private Context context; private Context context;
private String outputPath; private String outputPath;
private TestMuxerHolder testMuxerHolder; private TestMuxer.Holder muxerHolder;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
context = ApplicationProvider.getApplicationContext(); context = ApplicationProvider.getApplicationContext();
outputPath = Util.createTempFile(context, "TransformerTest").getPath(); outputPath = Util.createTempFile(context, "TransformerTest").getPath();
testMuxerHolder = new TestMuxerHolder(); muxerHolder = new TestMuxer.Holder();
createEncodersAndDecoders(); createEncodersAndDecoders();
} }
@ -82,7 +81,7 @@ public final class SequenceExportTest {
@Test @Test
public void start_concatenateSameMediaItemWithTransmux_completesSuccessfully() throws Exception { public void start_concatenateSameMediaItemWithTransmux_completesSuccessfully() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
EditedMediaItemSequence editedMediaItemSequence = EditedMediaItemSequence editedMediaItemSequence =
@ -98,7 +97,7 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_VIDEO + ".concatenated_transmux")); getDumpFileName(FILE_AUDIO_VIDEO + ".concatenated_transmux"));
} }
@ -106,7 +105,7 @@ public final class SequenceExportTest {
public void start_concatenateSameMediaItemWithEffectsAndTransmux_ignoresEffects() public void start_concatenateSameMediaItemWithEffectsAndTransmux_ignoresEffects()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
SonicAudioProcessor sonicAudioProcessor = createPitchChangingAudioProcessor(/* pitch= */ 2f); SonicAudioProcessor sonicAudioProcessor = createPitchChangingAudioProcessor(/* pitch= */ 2f);
Effect videoEffect = RgbFilter.createGrayscaleFilter(); Effect videoEffect = RgbFilter.createGrayscaleFilter();
@ -127,7 +126,7 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_VIDEO + ".concatenated_transmux")); getDumpFileName(FILE_AUDIO_VIDEO + ".concatenated_transmux"));
} }
@ -135,7 +134,7 @@ public final class SequenceExportTest {
public void start_concatenateClippedMediaItemsWithTransmux_completesSuccessfully() public void start_concatenateClippedMediaItemsWithTransmux_completesSuccessfully()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem.ClippingConfiguration clippingConfiguration1 = MediaItem.ClippingConfiguration clippingConfiguration1 =
new MediaItem.ClippingConfiguration.Builder() new MediaItem.ClippingConfiguration.Builder()
.setStartPositionMs(0) // Corresponds to key frame. .setStartPositionMs(0) // Corresponds to key frame.
@ -171,7 +170,7 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName( getDumpFileName(
FILE_AUDIO_VIDEO_INCREASING_TIMESTAMPS_15S + ".clipped_concatenated_transmux")); FILE_AUDIO_VIDEO_INCREASING_TIMESTAMPS_15S + ".clipped_concatenated_transmux"));
} }
@ -180,7 +179,7 @@ public final class SequenceExportTest {
public void concatenateAudioAndSilence_withTransmuxVideo_completesSuccessfully() public void concatenateAudioAndSilence_withTransmuxVideo_completesSuccessfully()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO);
EditedMediaItem audioVideoMediaItem = new EditedMediaItem.Builder(mediaItem).build(); EditedMediaItem audioVideoMediaItem = new EditedMediaItem.Builder(mediaItem).build();
EditedMediaItem videoOnlyMediaItem = EditedMediaItem videoOnlyMediaItem =
@ -198,7 +197,7 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_RAW_VIDEO + ".audio_then_silence")); getDumpFileName(FILE_AUDIO_RAW_VIDEO + ".audio_then_silence"));
} }
@ -206,7 +205,7 @@ public final class SequenceExportTest {
public void concatenateSilenceAndAudio_withTransmuxVideo_completesSuccessfully() public void concatenateSilenceAndAudio_withTransmuxVideo_completesSuccessfully()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO);
EditedMediaItem videoOnlyMediaItem = EditedMediaItem videoOnlyMediaItem =
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build(); new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
@ -224,7 +223,7 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_RAW_VIDEO + ".silence_then_audio")); getDumpFileName(FILE_AUDIO_RAW_VIDEO + ".silence_then_audio"));
} }
@ -232,7 +231,7 @@ public final class SequenceExportTest {
public void concatenateAudioAndSilence_withEffectsAndTransmuxVideo_completesSuccessfully() public void concatenateAudioAndSilence_withEffectsAndTransmuxVideo_completesSuccessfully()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO);
EditedMediaItem audioEditedMediaItem = EditedMediaItem audioEditedMediaItem =
new EditedMediaItem.Builder(mediaItem) new EditedMediaItem.Builder(mediaItem)
@ -262,7 +261,7 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_RAW_VIDEO + ".audio_then_silence_with_effects")); getDumpFileName(FILE_AUDIO_RAW_VIDEO + ".audio_then_silence_with_effects"));
} }
@ -270,7 +269,7 @@ public final class SequenceExportTest {
public void concatenateSilenceAndAudio_withEffectsAndTransmuxVideo_completesSuccessfully() public void concatenateSilenceAndAudio_withEffectsAndTransmuxVideo_completesSuccessfully()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO);
EditedMediaItem noAudioEditedMediaItem = EditedMediaItem noAudioEditedMediaItem =
new EditedMediaItem.Builder(mediaItem) new EditedMediaItem.Builder(mediaItem)
@ -301,7 +300,7 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_RAW_VIDEO + ".silence_then_audio_with_effects")); getDumpFileName(FILE_AUDIO_RAW_VIDEO + ".silence_then_audio_with_effects"));
} }
@ -309,7 +308,7 @@ public final class SequenceExportTest {
public void concatenateSilenceAndSilence_withTransmuxVideo_completesSuccessfully() public void concatenateSilenceAndSilence_withTransmuxVideo_completesSuccessfully()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO);
EditedMediaItem videoOnlyMediaItem = EditedMediaItem videoOnlyMediaItem =
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build(); new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
@ -326,7 +325,7 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_RAW_VIDEO + ".silence_then_silence")); getDumpFileName(FILE_AUDIO_RAW_VIDEO + ".silence_then_silence"));
} }
@ -334,7 +333,7 @@ public final class SequenceExportTest {
public void concatenateEditedSilenceAndSilence_withTransmuxVideo_completesSuccessfully() public void concatenateEditedSilenceAndSilence_withTransmuxVideo_completesSuccessfully()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO);
EditedMediaItem silenceWithEffectsItem = EditedMediaItem silenceWithEffectsItem =
new EditedMediaItem.Builder(mediaItem) new EditedMediaItem.Builder(mediaItem)
@ -365,7 +364,7 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_RAW_VIDEO + ".silence-effects_then_silence")); getDumpFileName(FILE_AUDIO_RAW_VIDEO + ".silence-effects_then_silence"));
} }
@ -373,7 +372,7 @@ public final class SequenceExportTest {
public void concatenateSilenceAndEditedSilence_withTransmuxVideo_completesSuccessfully() public void concatenateSilenceAndEditedSilence_withTransmuxVideo_completesSuccessfully()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO);
EditedMediaItem silenceWithEffectsItem = EditedMediaItem silenceWithEffectsItem =
new EditedMediaItem.Builder(mediaItem) new EditedMediaItem.Builder(mediaItem)
@ -404,7 +403,7 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_RAW_VIDEO + ".silence_then_silence-effects")); getDumpFileName(FILE_AUDIO_RAW_VIDEO + ".silence_then_silence-effects"));
} }
@ -412,7 +411,7 @@ public final class SequenceExportTest {
public void concatenateSilenceAndSilence_withEffectsAndTransmuxVideo_completesSuccessfully() public void concatenateSilenceAndSilence_withEffectsAndTransmuxVideo_completesSuccessfully()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO);
EditedMediaItem firstItem = EditedMediaItem firstItem =
new EditedMediaItem.Builder(mediaItem) new EditedMediaItem.Builder(mediaItem)
@ -443,14 +442,14 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_RAW_VIDEO + ".silence_then_silence_with_effects")); getDumpFileName(FILE_AUDIO_RAW_VIDEO + ".silence_then_silence_with_effects"));
} }
@Test @Test
public void concatenateTwoAudioItems_withSameFormat_completesSuccessfully() throws Exception { public void concatenateTwoAudioItems_withSameFormat_completesSuccessfully() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem audioOnlyMediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW); MediaItem audioOnlyMediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(audioOnlyMediaItem).build(); EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(audioOnlyMediaItem).build();
EditedMediaItemSequence editedMediaItemSequence = EditedMediaItemSequence editedMediaItemSequence =
@ -463,7 +462,7 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_RAW + ".concatenated")); getDumpFileName(FILE_AUDIO_RAW + ".concatenated"));
} }
@ -471,7 +470,7 @@ public final class SequenceExportTest {
public void concatenateTwoAudioItems_withSameFormatAndSameEffects_completesSuccessfully() public void concatenateTwoAudioItems_withSameFormatAndSameEffects_completesSuccessfully()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem audioOnlyMediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW); MediaItem audioOnlyMediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW);
SonicAudioProcessor sonicAudioProcessor = createPitchChangingAudioProcessor(/* pitch= */ 2f); SonicAudioProcessor sonicAudioProcessor = createPitchChangingAudioProcessor(/* pitch= */ 2f);
Effects effects = Effects effects =
@ -488,7 +487,7 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_RAW + ".concatenated_high_pitch")); getDumpFileName(FILE_AUDIO_RAW + ".concatenated_high_pitch"));
} }
@ -496,7 +495,7 @@ public final class SequenceExportTest {
public void concatenateTwoAudioItems_withSameFormatAndDiffEffects_completesSuccessfully() public void concatenateTwoAudioItems_withSameFormatAndDiffEffects_completesSuccessfully()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem audioOnlyMediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW); MediaItem audioOnlyMediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW);
Effects highPitchEffects = Effects highPitchEffects =
new Effects( new Effects(
@ -525,14 +524,14 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_RAW + ".high_pitch_then_low_pitch")); getDumpFileName(FILE_AUDIO_RAW + ".high_pitch_then_low_pitch"));
} }
@Test @Test
public void concatenateTwoAudioItems_withDiffFormat_completesSuccessfully() throws Exception { public void concatenateTwoAudioItems_withDiffFormat_completesSuccessfully() throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
MediaItem stereo48000Audio = MediaItem stereo48000Audio =
MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_STEREO_48000KHZ); MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_STEREO_48000KHZ);
MediaItem mono44100Audio = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW); MediaItem mono44100Audio = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW);
@ -549,7 +548,7 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_RAW_STEREO_48000KHZ + "_then_sample.wav")); getDumpFileName(FILE_AUDIO_RAW_STEREO_48000KHZ + "_then_sample.wav"));
} }
@ -557,7 +556,7 @@ public final class SequenceExportTest {
public void concatenateTwoAudioItems_withDiffFormatAndSameEffects_completesSuccessfully() public void concatenateTwoAudioItems_withDiffFormatAndSameEffects_completesSuccessfully()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
Effects highPitch = Effects highPitch =
new Effects( new Effects(
@ -584,7 +583,7 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_RAW_STEREO_48000KHZ + "-high_pitch_then_sample.wav-high_pitch")); getDumpFileName(FILE_AUDIO_RAW_STEREO_48000KHZ + "-high_pitch_then_sample.wav-high_pitch"));
} }
@ -592,7 +591,7 @@ public final class SequenceExportTest {
public void concatenateTwoAudioItems_withDiffFormatAndDiffEffects_completesSuccessfully() public void concatenateTwoAudioItems_withDiffFormatAndDiffEffects_completesSuccessfully()
throws Exception { throws Exception {
Transformer transformer = Transformer transformer =
createTransformerBuilder(testMuxerHolder, /* enableFallback= */ false).build(); createTransformerBuilder(muxerHolder, /* enableFallback= */ false).build();
EditedMediaItem stereo48000AudioHighPitch = EditedMediaItem stereo48000AudioHighPitch =
new EditedMediaItem.Builder( new EditedMediaItem.Builder(
@ -620,7 +619,7 @@ public final class SequenceExportTest {
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, context,
checkNotNull(testMuxerHolder.testMuxer), checkNotNull(muxerHolder.muxer),
getDumpFileName(FILE_AUDIO_RAW_STEREO_48000KHZ + "-high_pitch_then_sample.wav-low_pitch")); getDumpFileName(FILE_AUDIO_RAW_STEREO_48000KHZ + "-high_pitch_then_sample.wav-low_pitch"));
} }
} }

View File

@ -15,11 +15,13 @@
*/ */
package androidx.media3.transformer; package androidx.media3.transformer;
import androidx.annotation.Nullable;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.Format; import androidx.media3.common.Format;
import androidx.media3.common.Metadata; import androidx.media3.common.Metadata;
import androidx.media3.test.utils.DumpableFormat; import androidx.media3.test.utils.DumpableFormat;
import androidx.media3.test.utils.Dumper; import androidx.media3.test.utils.Dumper;
import com.google.common.collect.ImmutableList;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -34,13 +36,43 @@ import java.util.Map;
*/ */
public final class TestMuxer implements Muxer, Dumper.Dumpable { public final class TestMuxer implements Muxer, Dumper.Dumpable {
public static final class Holder {
@Nullable public TestMuxer muxer;
}
public static final class Factory implements Muxer.Factory {
private final Holder muxerHolder;
private final Muxer.Factory defaultMuxerFactory;
public Factory(Holder muxerHolder) {
this(muxerHolder, /* maxDelayBetweenSamplesMs= */ C.TIME_UNSET);
}
public Factory(Holder muxerHolder, long maxDelayBetweenSamplesMs) {
this.muxerHolder = muxerHolder;
defaultMuxerFactory = new DefaultMuxer.Factory(maxDelayBetweenSamplesMs);
}
@Override
public Muxer create(String path) throws Muxer.MuxerException {
muxerHolder.muxer = new TestMuxer(defaultMuxerFactory.create(path));
return muxerHolder.muxer;
}
@Override
public ImmutableList<String> getSupportedSampleMimeTypes(@C.TrackType int trackType) {
return defaultMuxerFactory.getSupportedSampleMimeTypes(trackType);
}
}
private final Muxer muxer; private final Muxer muxer;
private final Map<Integer, List<DumpableSample>> trackIndexToSampleDumpables; private final Map<Integer, List<DumpableSample>> trackIndexToSampleDumpables;
private final List<Dumper.Dumpable> dumpables; private final List<Dumper.Dumpable> dumpables;
/** Creates a new test muxer. */ /** Creates a new test muxer. */
public TestMuxer(String path, Muxer.Factory muxerFactory) throws MuxerException { private TestMuxer(Muxer muxer) {
muxer = muxerFactory.create(path); this.muxer = muxer;
dumpables = new ArrayList<>(); dumpables = new ArrayList<>();
trackIndexToSampleDumpables = new HashMap<>(); trackIndexToSampleDumpables = new HashMap<>();
} }

View File

@ -43,36 +43,6 @@ import org.robolectric.shadows.ShadowMediaCodecList;
@UnstableApi @UnstableApi
public final class TestUtil { public final class TestUtil {
public static final class TestMuxerFactory implements Muxer.Factory {
public static final class TestMuxerHolder {
@Nullable public TestMuxer testMuxer;
}
private final TestMuxerHolder testMuxerHolder;
private final Muxer.Factory defaultMuxerFactory;
public TestMuxerFactory(TestMuxerHolder testMuxerHolder) {
this(testMuxerHolder, /* maxDelayBetweenSamplesMs= */ C.TIME_UNSET);
}
public TestMuxerFactory(TestMuxerHolder testMuxerHolder, long maxDelayBetweenSamplesMs) {
this.testMuxerHolder = testMuxerHolder;
defaultMuxerFactory = new DefaultMuxer.Factory(maxDelayBetweenSamplesMs);
}
@Override
public Muxer create(String path) throws Muxer.MuxerException {
testMuxerHolder.testMuxer = new TestMuxer(path, defaultMuxerFactory);
return testMuxerHolder.testMuxer;
}
@Override
public ImmutableList<String> getSupportedSampleMimeTypes(@C.TrackType int trackType) {
return defaultMuxerFactory.getSupportedSampleMimeTypes(trackType);
}
}
public static final class FakeAssetLoader implements AssetLoader { public static final class FakeAssetLoader implements AssetLoader {
public static final class Factory implements AssetLoader.Factory { public static final class Factory implements AssetLoader.Factory {
@ -234,11 +204,11 @@ public final class TestUtil {
} }
public static Transformer.Builder createTransformerBuilder( public static Transformer.Builder createTransformerBuilder(
TestMuxerFactory.TestMuxerHolder testMuxerHolder, boolean enableFallback) { TestMuxer.Holder testMuxerHolder, boolean enableFallback) {
Context context = ApplicationProvider.getApplicationContext(); Context context = ApplicationProvider.getApplicationContext();
return new Transformer.Builder(context) return new Transformer.Builder(context)
.setClock(new FakeClock(/* isAutoAdvancing= */ true)) .setClock(new FakeClock(/* isAutoAdvancing= */ true))
.setMuxerFactory(new TestMuxerFactory(testMuxerHolder)) .setMuxerFactory(new TestMuxer.Factory(testMuxerHolder))
.setEncoderFactory( .setEncoderFactory(
new DefaultEncoderFactory.Builder(context).setEnableFallback(enableFallback).build()); new DefaultEncoderFactory.Builder(context).setEnableFallback(enableFallback).build());
} }