Undeprecate startTransformation(MediaItem, String)

This overload is helpful to apps transcoding a MediaItem without edits.

PiperOrigin-RevId: 505987852
This commit is contained in:
kimvde 2023-01-31 14:43:32 +00:00 committed by christosts
parent 8caf836053
commit c67cfbf8ce
9 changed files with 131 additions and 179 deletions

View File

@ -211,6 +211,20 @@ public class TransformerAndroidTestRunner {
}
}
/**
* Transforms the {@link MediaItem}, saving a summary of the transformation to the application
* cache.
*
* @param testId A unique identifier for the transformer test run.
* @param mediaItem The {@link MediaItem} to transform.
* @return The {@link TransformationTestResult}.
* @throws Exception The cause of the transformation not completing.
*/
public TransformationTestResult run(String testId, MediaItem mediaItem) throws Exception {
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
return run(testId, editedMediaItem);
}
/**
* Transforms the {@link EditedMediaItem}.
*

View File

@ -101,12 +101,11 @@ public class TransformerEndToEndTest {
.setEndPositionMs(clippingEndMs)
.build())
.build();
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
TransformationTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(/* testId= */ "clippedMedia_completesWithClippedDuration", editedMediaItem);
.run(/* testId= */ "clippedMedia_completesWithClippedDuration", mediaItem);
assertThat(result.transformationResult.durationMs).isAtMost(clippingEndMs - clippingStartMs);
}

View File

@ -28,7 +28,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.transformer.AndroidTestUtil;
import com.google.android.exoplayer2.transformer.EditedMediaItem;
import com.google.android.exoplayer2.transformer.TransformationException;
import com.google.android.exoplayer2.transformer.TransformationRequest;
import com.google.android.exoplayer2.transformer.TransformationTestResult;
@ -68,14 +67,12 @@ public class ForceInterpretHdrVideoAsSdrTest {
TransformationRequest.HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR)
.build())
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10)))
.build();
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10));
try {
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
.run(testId, mediaItem);
assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR);
Log.i(TAG, "Transformed.");
} catch (TransformationException exception) {
@ -107,14 +104,12 @@ public class ForceInterpretHdrVideoAsSdrTest {
TransformationRequest.HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR)
.build())
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10)))
.build();
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10));
try {
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
.run(testId, mediaItem);
assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR);
Log.i(TAG, "Transformed.");
} catch (TransformationException exception) {

View File

@ -74,15 +74,13 @@ public class HdrEditingTest {
Context context = ApplicationProvider.getApplicationContext();
Transformer transformer = new Transformer.Builder(context).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10)))
.build();
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10));
try {
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
.run(testId, mediaItem);
Log.i(TAG, "Transformed.");
assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_ST2084);
} catch (TransformationException exception) {
@ -99,15 +97,13 @@ public class HdrEditingTest {
Context context = ApplicationProvider.getApplicationContext();
Transformer transformer = new Transformer.Builder(context).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10)))
.build();
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10));
try {
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
.run(testId, mediaItem);
Log.i(TAG, "Transformed.");
assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_HLG);
} catch (TransformationException exception) {
@ -295,10 +291,7 @@ public class HdrEditingTest {
Transformer transformer = new Transformer.Builder(context).build();
MediaItem mediaItem =
MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_1_SECOND_HDR10_VIDEO_SDR_CONTAINER));
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
new TransformerAndroidTestRunner.Builder(context, transformer).build().run(testId, mediaItem);
}
private static boolean deviceSupportsHdrEditing(String mimeType, ColorInfo colorInfo) {

View File

@ -75,15 +75,13 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
}
})
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10)))
.build();
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10));
try {
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
.run(testId, mediaItem);
Log.i(TAG, "Tone mapped.");
assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR);
} catch (TransformationException exception) {
@ -121,15 +119,13 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
}
})
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10)))
.build();
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10));
try {
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
.run(testId, mediaItem);
Log.i(TAG, "Tone mapped.");
assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR);
} catch (TransformationException exception) {

View File

@ -31,7 +31,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.transformer.AndroidTestUtil;
import com.google.android.exoplayer2.transformer.EditedMediaItem;
import com.google.android.exoplayer2.transformer.TransformationException;
import com.google.android.exoplayer2.transformer.TransformationRequest;
import com.google.android.exoplayer2.transformer.TransformationTestResult;
@ -86,14 +85,12 @@ public class ToneMapHdrToSdrUsingOpenGlTest {
.setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL)
.build())
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10)))
.build();
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10));
try {
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
.run(testId, mediaItem);
Log.i(TAG, "Tone mapped.");
assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR);
} catch (TransformationException exception) {
@ -139,14 +136,12 @@ public class ToneMapHdrToSdrUsingOpenGlTest {
.setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL)
.build())
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10)))
.build();
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10));
try {
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
.run(testId, mediaItem);
Log.i(TAG, "Tone mapped.");
assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR);
} catch (TransformationException exception) {

View File

@ -60,11 +60,10 @@ public class TransformationTest {
.build();
MediaItem mediaItem =
MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(true)
.build()
.run(testId, editedMediaItem);
.run(testId, mediaItem);
}
@Test
@ -74,11 +73,8 @@ public class TransformationTest {
Transformer transformer = new Transformer.Builder(context).build();
MediaItem mediaItem =
MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
// No need to calculate SSIM because no decode/encoding, so input frames match output frames.
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
new TransformerAndroidTestRunner.Builder(context, transformer).build().run(testId, mediaItem);
}
@Test
@ -122,12 +118,11 @@ public class TransformationTest {
.setEncoderFactory(new ForceEncodeEncoderFactory(context))
.build();
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_REMOTE_4K60_PORTRAIT_URI_STRING));
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(true)
.setTimeoutSeconds(180)
.build()
.run(testId, editedMediaItem);
.run(testId, mediaItem);
}
@Test
@ -146,14 +141,12 @@ public class TransformationTest {
new Transformer.Builder(context)
.setEncoderFactory(new ForceEncodeEncoderFactory(context))
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_REMOTE_8K24_URI_STRING)))
.build();
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_REMOTE_8K24_URI_STRING));
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(true)
.setTimeoutSeconds(180)
.build()
.run(testId, editedMediaItem);
.run(testId, mediaItem);
}
@Test

View File

@ -662,7 +662,6 @@ public final class Transformer {
* it.
* @param path The path to the output file.
* @throws IllegalArgumentException If the path is invalid.
* @throws IllegalArgumentException If the {@link MediaItem} is not supported.
* @throws IllegalStateException If this method is called from the wrong thread.
* @throws IllegalStateException If a transformation is already in progress.
*/
@ -671,9 +670,30 @@ public final class Transformer {
}
/**
* @deprecated Use {@link #startTransformation(EditedMediaItem, String)} instead.
* Starts an asynchronous operation to transform the given {@link MediaItem}.
*
* <p>The transformation state is notified through the {@linkplain Builder#addListener(Listener)
* listener}.
*
* <p>Concurrent transformations on the same Transformer object are not allowed.
*
* <p>If no custom {@link Muxer.Factory} is specified, the output is an MP4 file.
*
* <p>The output can contain at most one video track and one audio track. Other track types are
* ignored. For adaptive bitrate, if no custom {@link AssetLoader.Factory} is specified, the
* highest bitrate video and audio streams are selected.
*
* <p>If encoding the output's video track is needed, the output frames' dimensions will be
* swapped if the height is larger than the width. This is to improve compatibility among
* different device encoders.
*
* @param mediaItem The {@link MediaItem} to transform.
* @param path The path to the output file.
* @throws IllegalArgumentException If the path is invalid.
* @throws IllegalArgumentException If the {@link MediaItem} is not supported.
* @throws IllegalStateException If this method is called from the wrong thread.
* @throws IllegalStateException If a transformation is already in progress.
*/
@Deprecated
public void startTransformation(MediaItem mediaItem, String path) {
if (!mediaItem.clippingConfiguration.equals(MediaItem.ClippingConfiguration.UNSET)
&& flattenForSlowMotion) {

View File

@ -129,10 +129,9 @@ public final class TransformerEndToEndTest {
@Test
public void startTransformation_videoOnlyPassthrough_completesSuccessfully() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(context, testMuxer, getDumpFileName(FILE_VIDEO_ONLY));
@ -142,9 +141,8 @@ public final class TransformerEndToEndTest {
public void startTransformation_audioOnlyPassthrough_completesSuccessfully() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
@ -161,9 +159,8 @@ public final class TransformerEndToEndTest {
.build())
.build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
@ -173,10 +170,9 @@ public final class TransformerEndToEndTest {
@Test
public void startTransformation_audioAndVideo_completesSuccessfully() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO));
@ -196,9 +192,8 @@ public final class TransformerEndToEndTest {
.setStartsAtKeyFrame(true)
.build())
.build();
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
@ -214,11 +209,9 @@ public final class TransformerEndToEndTest {
.setTransformationRequest(
new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build())
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SUBTITLES))
.build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SUBTITLES);
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(context, testMuxer, getDumpFileName(FILE_WITH_SUBTITLES));
@ -228,16 +221,15 @@ public final class TransformerEndToEndTest {
public void startTransformation_successiveTransformations_completesSuccessfully()
throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
// Transform first media item.
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
Files.delete(Paths.get(outputPath));
// Transform second media item.
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO));
@ -246,14 +238,12 @@ public final class TransformerEndToEndTest {
@Test
public void startTransformation_concurrentTransformations_throwsError() {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
assertThrows(
IllegalStateException.class,
() -> transformer.startTransformation(editedMediaItem, outputPath));
IllegalStateException.class, () -> transformer.startTransformation(mediaItem, outputPath));
}
@Test
@ -293,9 +283,8 @@ public final class TransformerEndToEndTest {
.experimentalSetGenerateSilentAudio(true)
.build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
@ -308,10 +297,9 @@ public final class TransformerEndToEndTest {
createTransformerBuilder(/* enableFallback= */ false)
.experimentalSetGenerateSilentAudio(true)
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO));
@ -358,10 +346,9 @@ public final class TransformerEndToEndTest {
createTransformerBuilder(/* enableFallback= */ false)
.experimentalSetGenerateSilentAudio(true)
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
@ -397,15 +384,14 @@ public final class TransformerEndToEndTest {
.addListener(mockListener2)
.addListener(mockListener3)
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
verify(mockListener1).onTransformationCompleted(eq(editedMediaItem.mediaItem), any());
verify(mockListener2).onTransformationCompleted(eq(editedMediaItem.mediaItem), any());
verify(mockListener3).onTransformationCompleted(eq(editedMediaItem.mediaItem), any());
verify(mockListener1).onTransformationCompleted(eq(mediaItem), any());
verify(mockListener2).onTransformationCompleted(eq(mediaItem), any());
verify(mockListener3).onTransformationCompleted(eq(mediaItem), any());
}
@Test
@ -422,19 +408,15 @@ public final class TransformerEndToEndTest {
new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build())
.build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformationException exception =
assertThrows(
TransformationException.class, () -> TransformerTestRunner.runLooper(transformer));
verify(mockListener1)
.onTransformationError(eq(editedMediaItem.mediaItem), any(), eq(exception));
verify(mockListener2)
.onTransformationError(eq(editedMediaItem.mediaItem), any(), eq(exception));
verify(mockListener3)
.onTransformationError(eq(editedMediaItem.mediaItem), any(), eq(exception));
verify(mockListener1).onTransformationError(eq(mediaItem), any(), eq(exception));
verify(mockListener2).onTransformationError(eq(mediaItem), any(), eq(exception));
verify(mockListener3).onTransformationError(eq(mediaItem), any(), eq(exception));
}
@Test
@ -453,26 +435,16 @@ public final class TransformerEndToEndTest {
.addListener(mockListener3)
.build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
verify(mockListener1)
.onFallbackApplied(
editedMediaItem.mediaItem,
originalTransformationRequest,
fallbackTransformationRequest);
.onFallbackApplied(mediaItem, originalTransformationRequest, fallbackTransformationRequest);
verify(mockListener2)
.onFallbackApplied(
editedMediaItem.mediaItem,
originalTransformationRequest,
fallbackTransformationRequest);
.onFallbackApplied(mediaItem, originalTransformationRequest, fallbackTransformationRequest);
verify(mockListener3)
.onFallbackApplied(
editedMediaItem.mediaItem,
originalTransformationRequest,
fallbackTransformationRequest);
.onFallbackApplied(mediaItem, originalTransformationRequest, fallbackTransformationRequest);
}
@Test
@ -488,15 +460,14 @@ public final class TransformerEndToEndTest {
.addListener(mockListener3)
.build();
Transformer transformer2 = transformer1.buildUpon().removeListener(mockListener2).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer2.startTransformation(editedMediaItem, outputPath);
transformer2.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer2);
verify(mockListener1).onTransformationCompleted(eq(editedMediaItem.mediaItem), any());
verify(mockListener2, never()).onTransformationCompleted(eq(editedMediaItem.mediaItem), any());
verify(mockListener3).onTransformationCompleted(eq(editedMediaItem.mediaItem), any());
verify(mockListener1).onTransformationCompleted(eq(mediaItem), any());
verify(mockListener2, never()).onTransformationCompleted(eq(mediaItem), any());
verify(mockListener3).onTransformationCompleted(eq(mediaItem), any());
}
@Test
@ -516,10 +487,9 @@ public final class TransformerEndToEndTest {
@Test
public void startTransformation_completesWithValidBitrate() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformationResult result = TransformerTestRunner.runLooper(transformer);
assertThat(result.averageAudioBitrate).isGreaterThan(0);
@ -537,9 +507,8 @@ public final class TransformerEndToEndTest {
.build())
.build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformationException exception =
assertThrows(
TransformationException.class, () -> TransformerTestRunner.runLooper(transformer));
@ -558,9 +527,8 @@ public final class TransformerEndToEndTest {
.build())
.build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformationException exception =
assertThrows(
TransformationException.class, () -> TransformerTestRunner.runLooper(transformer));
@ -572,10 +540,9 @@ public final class TransformerEndToEndTest {
@Test
public void startTransformation_withIoError_completesWithError() {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri("asset:///non-existing-path.mp4")).build();
MediaItem mediaItem = MediaItem.fromUri("asset:///non-existing-path.mp4");
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformationException exception =
assertThrows(
TransformationException.class, () -> TransformerTestRunner.runLooper(transformer));
@ -595,18 +562,14 @@ public final class TransformerEndToEndTest {
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ false).addListener(mockListener).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
context, testMuxer, getDumpFileName(FILE_AUDIO_UNSUPPORTED_BY_MUXER + ".fallback"));
verify(mockListener)
.onFallbackApplied(
editedMediaItem.mediaItem,
originalTransformationRequest,
fallbackTransformationRequest);
.onFallbackApplied(mediaItem, originalTransformationRequest, fallbackTransformationRequest);
}
@Test
@ -620,18 +583,14 @@ public final class TransformerEndToEndTest {
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ true).addListener(mockListener).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
context, testMuxer, getDumpFileName(FILE_AUDIO_UNSUPPORTED_BY_MUXER + ".fallback"));
verify(mockListener)
.onFallbackApplied(
editedMediaItem.mediaItem,
originalTransformationRequest,
fallbackTransformationRequest);
.onFallbackApplied(mediaItem, originalTransformationRequest, fallbackTransformationRequest);
}
@Test
@ -648,10 +607,9 @@ public final class TransformerEndToEndTest {
.setAssetLoaderFactory(assetLoaderFactory)
.setMuxerFactory(muxerFactory)
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformationException exception =
assertThrows(
TransformationException.class, () -> TransformerTestRunner.runLooper(transformer));
@ -665,10 +623,9 @@ public final class TransformerEndToEndTest {
Muxer.Factory muxerFactory = new TestMuxerFactory(/* maxDelayBetweenSamplesMs= */ C.TIME_UNSET);
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ false).setMuxerFactory(muxerFactory).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO));
@ -677,15 +634,14 @@ public final class TransformerEndToEndTest {
@Test
public void startTransformation_afterCancellation_completesSuccessfully() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
transformer.cancel();
Files.delete(Paths.get(outputPath));
// This would throw if the previous transformation had not been cancelled.
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformationResult transformationResult = TransformerTestRunner.runLooper(transformer);
// TODO(b/264974805): Make transformation output deterministic and check it against dump file.
@ -699,8 +655,7 @@ public final class TransformerEndToEndTest {
Looper looper = anotherThread.getLooper();
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ false).setLooper(looper).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
AtomicReference<Exception> exception = new AtomicReference<>();
CountDownLatch countDownLatch = new CountDownLatch(1);
@ -708,7 +663,7 @@ public final class TransformerEndToEndTest {
.post(
() -> {
try {
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
} catch (Exception e) {
exception.set(e);
@ -725,8 +680,7 @@ public final class TransformerEndToEndTest {
@Test
public void startTransformation_fromWrongThread_throwsError() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
HandlerThread anotherThread = new HandlerThread("AnotherThread");
AtomicReference<IllegalStateException> illegalStateException = new AtomicReference<>();
CountDownLatch countDownLatch = new CountDownLatch(1);
@ -736,7 +690,7 @@ public final class TransformerEndToEndTest {
.post(
() -> {
try {
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
} catch (IllegalStateException e) {
illegalStateException.set(e);
} finally {
@ -757,10 +711,9 @@ public final class TransformerEndToEndTest {
.setAssetLoaderFactory(
new FakeAssetLoader.Factory(SUPPORTED_OUTPUT_TYPE_DECODED, sampleConsumerRef))
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
runLooperUntil(transformer.getApplicationLooper(), () -> sampleConsumerRef.get() != null);
assertThat(sampleConsumerRef.get().expectsDecodedData()).isTrue();
@ -811,8 +764,7 @@ public final class TransformerEndToEndTest {
@Test
public void getProgress_knownDuration_returnsConsistentStates() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
AtomicInteger previousProgressState =
new AtomicInteger(PROGRESS_STATE_WAITING_FOR_AVAILABILITY);
AtomicBoolean foundInconsistentState = new AtomicBoolean();
@ -848,7 +800,7 @@ public final class TransformerEndToEndTest {
}
};
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
progressHandler.sendEmptyMessage(0);
TransformerTestRunner.runLooper(transformer);
@ -858,8 +810,7 @@ public final class TransformerEndToEndTest {
@Test
public void getProgress_knownDuration_givesIncreasingPercentages() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
List<Integer> progresses = new ArrayList<>();
Handler progressHandler =
new Handler(Looper.myLooper()) {
@ -878,7 +829,7 @@ public final class TransformerEndToEndTest {
}
};
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
progressHandler.sendEmptyMessage(0);
TransformerTestRunner.runLooper(transformer);
@ -894,11 +845,10 @@ public final class TransformerEndToEndTest {
@Test
public void getProgress_noCurrentTransformation_returnsNoTransformation() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
@Transformer.ProgressState int stateBeforeTransform = transformer.getProgress(progressHolder);
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@Transformer.ProgressState int stateAfterTransform = transformer.getProgress(progressHolder);
@ -909,9 +859,7 @@ public final class TransformerEndToEndTest {
@Test
public void getProgress_unknownDuration_returnsConsistentStates() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_UNKNOWN_DURATION))
.build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_UNKNOWN_DURATION);
AtomicInteger previousProgressState =
new AtomicInteger(PROGRESS_STATE_WAITING_FOR_AVAILABILITY);
AtomicBoolean foundInconsistentState = new AtomicBoolean();
@ -944,7 +892,7 @@ public final class TransformerEndToEndTest {
}
};
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
progressHandler.sendEmptyMessage(0);
TransformerTestRunner.runLooper(transformer);
@ -978,10 +926,9 @@ public final class TransformerEndToEndTest {
@Test
public void cancel_afterCompletion_doesNotThrow() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
transformer.startTransformation(editedMediaItem, outputPath);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
transformer.cancel();
}