Move removeAudio/Video to EditedMediaItem

Also add a Builder to EditedMediaItem to avoid having a constructor with
many optional parameters, or a chain of constructors.

PiperOrigin-RevId: 504588544
This commit is contained in:
kimvde 2023-01-25 17:50:36 +00:00 committed by christosts
parent 50beec56f4
commit e8ffc7b6f8
19 changed files with 365 additions and 194 deletions

View File

@ -286,8 +286,6 @@ public final class TransformerActivity extends AppCompatActivity {
transformerBuilder.setTransformationRequest(requestBuilder.build());
transformerBuilder
.setRemoveAudio(bundle.getBoolean(ConfigurationActivity.SHOULD_REMOVE_AUDIO))
.setRemoveVideo(bundle.getBoolean(ConfigurationActivity.SHOULD_REMOVE_VIDEO))
.experimentalSetGenerateSilentAudio(
bundle.getBoolean(ConfigurationActivity.GENERATE_SILENT_AUDIO))
.setEncoderFactory(
@ -345,14 +343,17 @@ public final class TransformerActivity extends AppCompatActivity {
})
private EditedMediaItem createEditedMediaItem(MediaItem mediaItem, @Nullable Bundle bundle)
throws PackageManager.NameNotFoundException {
EditedMediaItem.Builder editedMediaItemBuilder = new EditedMediaItem.Builder(mediaItem);
if (bundle == null) {
return new EditedMediaItem(mediaItem);
return editedMediaItemBuilder.build();
}
ImmutableList<AudioProcessor> audioProcessors = createAudioProcessorsFromBundle(bundle);
ImmutableList<Effect> videoEffects = createVideoEffectsFromBundle(bundle);
Effects effects = new Effects(audioProcessors, videoEffects);
return new EditedMediaItem(mediaItem, effects);
return editedMediaItemBuilder
.setRemoveAudio(bundle.getBoolean(ConfigurationActivity.SHOULD_REMOVE_AUDIO))
.setRemoveVideo(bundle.getBoolean(ConfigurationActivity.SHOULD_REMOVE_VIDEO))
.setEffects(new Effects(audioProcessors, videoEffects))
.build();
}
private ImmutableList<AudioProcessor> createAudioProcessorsFromBundle(Bundle bundle) {

View File

@ -173,19 +173,6 @@ public class TransformerAndroidTestRunner {
this.inputValues = inputValues;
}
/**
* 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 {
return run(testId, new EditedMediaItem(mediaItem));
}
/**
* Transforms the {@link EditedMediaItem}, saving a summary of the transformation to the
* application cache.

View File

@ -51,7 +51,8 @@ public class TransformerEndToEndTest {
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING));
ImmutableList<Effect> videoEffects = ImmutableList.of(Presentation.createForHeight(480));
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects);
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).build();
// Result of the following command:
// ffprobe -count_frames -select_streams v:0 -show_entries stream=nb_read_frames sample.mp4
int expectedFrameCount = 30;
@ -68,14 +69,14 @@ public class TransformerEndToEndTest {
public void videoOnly_completesWithConsistentDuration() throws Exception {
Transformer transformer =
new Transformer.Builder(context)
.setRemoveAudio(true)
.setEncoderFactory(
new DefaultEncoderFactory.Builder(context).setEnableFallback(false).build())
.build();
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING));
ImmutableList<Effect> videoEffects = ImmutableList.of(Presentation.createForHeight(480));
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects);
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).setEffects(effects).build();
long expectedDurationMs = 967;
TransformationTestResult result =
@ -100,11 +101,12 @@ 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", mediaItem);
.run(/* testId= */ "clippedMedia_completesWithClippedDuration", editedMediaItem);
assertThat(result.transformationResult.durationMs).isAtMost(clippingEndMs - clippingStartMs);
}
@ -114,6 +116,9 @@ public class TransformerEndToEndTest {
Transformer transformer =
new Transformer.Builder(context)
.setEncoderFactory(new VideoUnsupportedEncoderFactory(context))
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING)))
.setRemoveAudio(true)
.build();
@ -125,7 +130,7 @@ public class TransformerEndToEndTest {
.build()
.run(
/* testId= */ "videoEncoderFormatUnsupported_completesWithError",
MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING))));
editedMediaItem));
assertThat(exception).hasCauseThat().isInstanceOf(IllegalArgumentException.class);
assertThat(exception.errorCode)

View File

@ -27,6 +27,7 @@ import androidx.media3.common.C;
import androidx.media3.common.MediaItem;
import androidx.media3.common.util.Log;
import androidx.media3.transformer.AndroidTestUtil;
import androidx.media3.transformer.EditedMediaItem;
import androidx.media3.transformer.TransformationException;
import androidx.media3.transformer.TransformationRequest;
import androidx.media3.transformer.TransformationTestResult;
@ -67,11 +68,14 @@ 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();
try {
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10)));
.run(testId, editedMediaItem);
assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR);
Log.i(TAG, "Transformed.");
} catch (TransformationException exception) {
@ -103,11 +107,14 @@ 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();
try {
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10)));
.run(testId, editedMediaItem);
assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR);
Log.i(TAG, "Transformed.");
} catch (TransformationException exception) {

View File

@ -74,12 +74,15 @@ 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();
try {
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10)));
.run(testId, editedMediaItem);
Log.i(TAG, "Transformed.");
assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_ST2084);
} catch (TransformationException exception) {
@ -96,12 +99,15 @@ 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();
try {
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10)));
.run(testId, editedMediaItem);
Log.i(TAG, "Transformed.");
assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_HLG);
} catch (TransformationException exception) {
@ -127,7 +133,8 @@ public class HdrEditingTest {
ImmutableList<Effect> videoEffects =
ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(180).build());
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects);
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).build();
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
@ -151,7 +158,8 @@ public class HdrEditingTest {
ImmutableList<Effect> videoEffects =
ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(180).build());
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects);
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).build();
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
@ -194,7 +202,8 @@ public class HdrEditingTest {
ImmutableList<Effect> videoEffects =
ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(180).build());
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects);
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).build();
try {
TransformationTestResult transformationTestResult =
@ -249,7 +258,8 @@ public class HdrEditingTest {
ImmutableList<Effect> videoEffects =
ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(180).build());
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects);
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).build();
try {
TransformationTestResult transformationTestResult =
@ -283,11 +293,12 @@ 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,
MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_1_SECOND_HDR10_VIDEO_SDR_CONTAINER)));
.run(testId, editedMediaItem);
}
private static boolean deviceSupportsHdrEditing(String mimeType, ColorInfo colorInfo) {

View File

@ -59,7 +59,8 @@ public final class RepeatedTranscodeTest {
ImmutableList<Effect> videoEffects =
ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(45).build());
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects);
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).build();
Set<Long> differentOutputSizesBytes = new HashSet<>();
for (int i = 0; i < TRANSCODE_COUNT; i++) {
@ -83,7 +84,6 @@ public final class RepeatedTranscodeTest {
new TransformerAndroidTestRunner.Builder(
context,
new Transformer.Builder(context)
.setRemoveAudio(true)
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
.build())
.build();
@ -92,7 +92,8 @@ public final class RepeatedTranscodeTest {
ImmutableList<Effect> videoEffects =
ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(45).build());
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects);
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).setEffects(effects).build();
Set<Long> differentOutputSizesBytes = new HashSet<>();
for (int i = 0; i < TRANSCODE_COUNT; i++) {
@ -117,11 +118,14 @@ public final class RepeatedTranscodeTest {
new TransformerAndroidTestRunner.Builder(
context,
new Transformer.Builder(context)
.setRemoveVideo(true)
.setTransformationRequest(new TransformationRequest.Builder().build())
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
.build())
.build();
MediaItem mediaItem =
MediaItem.fromUri(Uri.parse(AndroidTestUtil.MP4_REMOTE_10_SECONDS_URI_STRING));
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setRemoveVideo(true).build();
Set<Long> differentOutputSizesBytes = new HashSet<>();
for (int i = 0; i < TRANSCODE_COUNT; i++) {
@ -129,7 +133,7 @@ public final class RepeatedTranscodeTest {
TransformationTestResult testResult =
transformerRunner.run(
/* testId= */ "repeatedTranscodeNoVideo_givesConsistentLengthOutput_" + i,
MediaItem.fromUri(Uri.parse(AndroidTestUtil.MP4_REMOTE_10_SECONDS_URI_STRING)));
editedMediaItem);
differentOutputSizesBytes.add(checkNotNull(testResult.transformationResult.fileSizeBytes));
}

View File

@ -75,12 +75,15 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
}
})
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10)))
.build();
try {
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10)));
.run(testId, editedMediaItem);
Log.i(TAG, "Tone mapped.");
assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR);
} catch (TransformationException exception) {
@ -118,12 +121,15 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
}
})
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10)))
.build();
try {
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10)));
.run(testId, editedMediaItem);
Log.i(TAG, "Tone mapped.");
assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR);
} catch (TransformationException exception) {
@ -165,7 +171,8 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
ImmutableList<Effect> videoEffects =
ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(180).build());
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects);
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).build();
try {
TransformationTestResult transformationTestResult =
@ -213,7 +220,8 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
ImmutableList<Effect> videoEffects =
ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(180).build());
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects);
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).build();
try {
TransformationTestResult transformationTestResult =

View File

@ -32,6 +32,7 @@ import androidx.media3.common.util.GlUtil;
import androidx.media3.common.util.Log;
import androidx.media3.common.util.Util;
import androidx.media3.transformer.AndroidTestUtil;
import androidx.media3.transformer.EditedMediaItem;
import androidx.media3.transformer.TransformationException;
import androidx.media3.transformer.TransformationRequest;
import androidx.media3.transformer.TransformationTestResult;
@ -85,11 +86,14 @@ 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();
try {
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10)));
.run(testId, editedMediaItem);
Log.i(TAG, "Tone mapped.");
assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR);
} catch (TransformationException exception) {
@ -135,11 +139,14 @@ 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();
try {
TransformationTestResult transformationTestResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10)));
.run(testId, editedMediaItem);
Log.i(TAG, "Tone mapped.");
assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR);
} catch (TransformationException exception) {

View File

@ -24,6 +24,7 @@ import androidx.media3.common.MediaItem;
import androidx.media3.common.MimeTypes;
import androidx.media3.transformer.AndroidTestUtil;
import androidx.media3.transformer.DefaultEncoderFactory;
import androidx.media3.transformer.EditedMediaItem;
import androidx.media3.transformer.TransformationRequest;
import androidx.media3.transformer.TransformationTestResult;
import androidx.media3.transformer.Transformer;
@ -62,17 +63,18 @@ public final class TranscodeQualityTest {
.experimentalSetEnableHighQualityTargeting(true)
.build())
.build())
.setRemoveAudio(true)
.build();
MediaItem mediaItem =
MediaItem.fromUri(
Uri.parse(AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
TransformationTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(true)
.build()
.run(
testId,
MediaItem.fromUri(
Uri.parse(AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING)));
.run(testId, editedMediaItem);
if (result.ssim != TransformationTestResult.SSIM_UNSET) {
assertThat(result.ssim).isGreaterThan(0.90);
@ -99,17 +101,18 @@ public final class TranscodeQualityTest {
new Transformer.Builder(context)
.setTransformationRequest(
new TransformationRequest.Builder().setVideoMimeType(MimeTypes.VIDEO_H265).build())
.setRemoveAudio(true)
.build();
MediaItem mediaItem =
MediaItem.fromUri(
Uri.parse(AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
TransformationTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(true)
.build()
.run(
testId,
MediaItem.fromUri(
Uri.parse(AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING)));
.run(testId, editedMediaItem);
if (result.ssim != TransformationTestResult.SSIM_UNSET) {
assertThat(result.ssim).isGreaterThan(0.90);
@ -129,19 +132,19 @@ public final class TranscodeQualityTest {
.setTransformationRequest(
new TransformationRequest.Builder().setVideoMimeType(MimeTypes.VIDEO_H264).build())
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
.setRemoveAudio(true)
.build();
MediaItem mediaItem =
MediaItem.fromUri(
Uri.parse(
AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING));
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
TransformationTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(true)
.build()
.run(
testId,
MediaItem.fromUri(
Uri.parse(
AndroidTestUtil
.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING)));
.run(testId, editedMediaItem);
if (result.ssim != TransformationTestResult.SSIM_UNSET) {
assertThat(result.ssim).isGreaterThan(0.90);

View File

@ -59,10 +59,13 @@ public class TransformationTest {
new Transformer.Builder(context)
.setEncoderFactory(new ForceEncodeEncoderFactory(context))
.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, MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING)));
.run(testId, editedMediaItem);
}
@Test
@ -70,10 +73,13 @@ public class TransformationTest {
String testId = TAG + "_transformWithoutDecodeEncode";
Context context = ApplicationProvider.getApplicationContext();
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, MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING)));
.run(testId, editedMediaItem);
}
@Test
@ -82,7 +88,6 @@ public class TransformationTest {
Context context = ApplicationProvider.getApplicationContext();
Transformer transformer =
new Transformer.Builder(context)
.setRemoveAudio(true)
.setEncoderFactory(
new ForceEncodeEncoderFactory(
/* wrappedEncoderFactory= */ new DefaultEncoderFactory.Builder(context)
@ -90,10 +95,14 @@ public class TransformationTest {
new VideoEncoderSettings.Builder().setBitrate(5_000_000).build())
.build()))
.build();
MediaItem mediaItem =
MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(true)
.build()
.run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING)));
.run(testId, editedMediaItem);
}
@Test
@ -113,11 +122,13 @@ public class TransformationTest {
new Transformer.Builder(context)
.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, MediaItem.fromUri(Uri.parse(MP4_REMOTE_4K60_PORTRAIT_URI_STRING)));
.run(testId, editedMediaItem);
}
@Test
@ -136,11 +147,14 @@ 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();
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(true)
.setTimeoutSeconds(180)
.build()
.run(testId, MediaItem.fromUri(Uri.parse(MP4_REMOTE_8K24_URI_STRING)));
.run(testId, editedMediaItem);
}
@Test
@ -150,12 +164,15 @@ public class TransformationTest {
Transformer transformer =
new Transformer.Builder(context)
.setEncoderFactory(new ForceEncodeEncoderFactory(context))
.setRemoveAudio(true)
.build();
MediaItem mediaItem =
MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(true)
.build()
.run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING)));
.run(testId, editedMediaItem);
}
@Test
@ -165,11 +182,14 @@ public class TransformationTest {
Transformer transformer =
new Transformer.Builder(context)
.setEncoderFactory(new ForceEncodeEncoderFactory(context))
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING)))
.setRemoveVideo(true)
.build();
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING)));
.run(testId, editedMediaItem);
}
@Test
@ -188,9 +208,11 @@ public class TransformationTest {
.setTransformationRequest(
new TransformationRequest.Builder().setFlattenForSlowMotion(true).build())
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_SEF_URI_STRING))).build();
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_SEF_URI_STRING)));
.run(testId, editedMediaItem);
}
@Test
@ -204,7 +226,8 @@ public class TransformationTest {
ImmutableList<Effect> videoEffects =
ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(45).build());
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects);
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).build();
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()

View File

@ -42,6 +42,7 @@ import androidx.media3.common.MediaItem;
import androidx.media3.common.util.Assertions;
import androidx.media3.transformer.AndroidTestUtil;
import androidx.media3.transformer.DefaultEncoderFactory;
import androidx.media3.transformer.EditedMediaItem;
import androidx.media3.transformer.Transformer;
import androidx.media3.transformer.TransformerAndroidTestRunner;
import androidx.media3.transformer.VideoEncoderSettings;
@ -142,7 +143,6 @@ public class BitrateAnalysisTest {
Transformer transformer =
new Transformer.Builder(context)
.setRemoveAudio(true)
.setEncoderFactory(
new AndroidTestUtil.ForceEncodeEncoderFactory(
/* wrappedEncoderFactory= */ new DefaultEncoderFactory.Builder(context)
@ -154,11 +154,15 @@ public class BitrateAnalysisTest {
.setEnableFallback(false)
.build()))
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(fileUri)))
.setRemoveAudio(true)
.build();
new TransformerAndroidTestRunner.Builder(context, transformer)
.setInputValues(inputValues)
.setRequestCalculateSsim(true)
.build()
.run(testId, MediaItem.fromUri(Uri.parse(fileUri)));
.run(testId, editedMediaItem);
}
}

View File

@ -27,6 +27,7 @@ import androidx.media3.common.MediaItem;
import androidx.media3.common.util.Util;
import androidx.media3.transformer.AndroidTestUtil;
import androidx.media3.transformer.DefaultEncoderFactory;
import androidx.media3.transformer.EditedMediaItem;
import androidx.media3.transformer.Transformer;
import androidx.media3.transformer.TransformerAndroidTestRunner;
import androidx.media3.transformer.VideoEncoderSettings;
@ -118,7 +119,6 @@ public class EncoderPerformanceAnalysisTest {
Transformer transformer =
new Transformer.Builder(context)
.setRemoveAudio(true)
.setEncoderFactory(
new AndroidTestUtil.ForceEncodeEncoderFactory(
/* wrappedEncoderFactory= */ new DefaultEncoderFactory.Builder(context)
@ -129,10 +129,14 @@ public class EncoderPerformanceAnalysisTest {
.setEnableFallback(false)
.build()))
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(fileUri)))
.setRemoveAudio(true)
.build();
new TransformerAndroidTestRunner.Builder(context, transformer)
.setInputValues(inputValues)
.build()
.run(testId, MediaItem.fromUri(Uri.parse(fileUri)));
.run(testId, editedMediaItem);
}
}

View File

@ -55,6 +55,7 @@ import androidx.media3.common.MimeTypes;
import androidx.media3.common.util.Util;
import androidx.media3.transformer.AndroidTestUtil;
import androidx.media3.transformer.DefaultEncoderFactory;
import androidx.media3.transformer.EditedMediaItem;
import androidx.media3.transformer.TransformationRequest;
import androidx.media3.transformer.Transformer;
import androidx.media3.transformer.TransformerAndroidTestRunner;
@ -287,7 +288,6 @@ public class SsimMapperTest {
Transformer transformer =
new Transformer.Builder(context)
.setRemoveAudio(true)
.setTransformationRequest(
new TransformationRequest.Builder().setVideoMimeType(outputMimeType).build())
.setEncoderFactory(
@ -300,6 +300,10 @@ public class SsimMapperTest {
.setEnableFallback(false)
.build())
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(videoUri)))
.setRemoveAudio(true)
.build();
transformationsLeft--;
@ -308,7 +312,7 @@ public class SsimMapperTest {
.setInputValues(inputValues)
.setRequestCalculateSsim(true)
.build()
.run(testId, MediaItem.fromUri(Uri.parse(videoUri)))
.run(testId, editedMediaItem)
.ssim;
checkState(ssim != SSIM_UNSET, "SSIM has not been calculated.");

View File

@ -15,34 +15,106 @@
*/
package androidx.media3.transformer;
import static androidx.media3.common.util.Assertions.checkState;
import androidx.media3.common.MediaItem;
import androidx.media3.common.util.UnstableApi;
import com.google.common.collect.ImmutableList;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
/** A {@link MediaItem} with the transformations to apply to it. */
@UnstableApi
public class EditedMediaItem {
/* package */ final MediaItem mediaItem;
/* package */ final Effects effects;
/** A builder for {@link EditedMediaItem} instances. */
public static final class Builder {
/**
* Creates an instance with no {@link Effects}.
*
* @param mediaItem The {@link MediaItem} to edit.
*/
public EditedMediaItem(MediaItem mediaItem) {
this(mediaItem, new Effects(ImmutableList.of(), ImmutableList.of()));
private final MediaItem mediaItem;
private boolean removeAudio;
private boolean removeVideo;
private @MonotonicNonNull Effects effects;
/**
* Creates an instance.
*
* @param mediaItem The {@link MediaItem} on which transformations are applied.
*/
public Builder(MediaItem mediaItem) {
this.mediaItem = mediaItem;
}
/**
* Sets whether to remove the audio from the {@link MediaItem}.
*
* <p>The default value is {@code false}.
*
* <p>The audio and video cannot both be removed because the output would not contain any
* samples.
*
* @param removeAudio Whether to remove the audio.
* @return This builder.
*/
@CanIgnoreReturnValue
public Builder setRemoveAudio(boolean removeAudio) {
this.removeAudio = removeAudio;
return this;
}
/**
* Sets whether to remove the video from the {@link MediaItem}.
*
* <p>The default value is {@code false}.
*
* <p>The audio and video cannot both be removed because the output would not contain any
* samples.
*
* @param removeVideo Whether to remove the video.
* @return This builder.
*/
@CanIgnoreReturnValue
public Builder setRemoveVideo(boolean removeVideo) {
this.removeVideo = removeVideo;
return this;
}
/**
* Sets the {@link Effects} to apply to the {@link MediaItem}.
*
* <p>The default value is an empty {@link Effects} instance.
*
* @param effects The {@link Effects} to apply.
* @return This builder.
*/
@CanIgnoreReturnValue
public Builder setEffects(Effects effects) {
this.effects = effects;
return this;
}
/** Builds an {@link EditedMediaItem} instance. */
public EditedMediaItem build() {
if (effects == null) {
effects =
new Effects(
/* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of());
}
return new EditedMediaItem(mediaItem, removeAudio, removeVideo, effects);
}
}
/**
* Creates an instance.
*
* @param mediaItem The {@link MediaItem} to edit.
* @param effects The {@link Effects} to apply to the {@code mediaItem}.
*/
public EditedMediaItem(MediaItem mediaItem, Effects effects) {
/* package */ final MediaItem mediaItem;
/* package */ final boolean removeAudio;
/* package */ final boolean removeVideo;
/* package */ final Effects effects;
private EditedMediaItem(
MediaItem mediaItem, boolean removeAudio, boolean removeVideo, Effects effects) {
checkState(!removeAudio || !removeVideo, "Audio and video cannot both be removed");
this.mediaItem = mediaItem;
this.removeAudio = removeAudio;
this.removeVideo = removeVideo;
this.effects = effects;
}
}

View File

@ -175,34 +175,24 @@ public final class Transformer {
}
/**
* Sets whether to remove the audio from the output.
*
* <p>The default value is {@code false}.
*
* <p>The audio and video cannot both be removed because the output would not contain any
* samples.
*
* @param removeAudio Whether to remove the audio.
* @return This builder.
* @deprecated Use {@link EditedMediaItem.Builder#setRemoveAudio(boolean)} to remove the audio
* from the {@link EditedMediaItem} passed to {@link #startTransformation(EditedMediaItem,
* String)} or {@link #startTransformation(EditedMediaItem, ParcelFileDescriptor)} instead.
*/
@CanIgnoreReturnValue
@Deprecated
public Builder setRemoveAudio(boolean removeAudio) {
this.removeAudio = removeAudio;
return this;
}
/**
* Sets whether to remove the video from the output.
*
* <p>The default value is {@code false}.
*
* <p>The audio and video cannot both be removed because the output would not contain any
* samples.
*
* @param removeVideo Whether to remove the video.
* @return This builder.
* @deprecated Use {@link EditedMediaItem.Builder#setRemoveVideo(boolean)} to remove the video
* from the {@link EditedMediaItem} passed to {@link #startTransformation(EditedMediaItem,
* String)} or {@link #startTransformation(EditedMediaItem, ParcelFileDescriptor)} instead.
*/
@CanIgnoreReturnValue
@Deprecated
public Builder setRemoveVideo(boolean removeVideo) {
this.removeVideo = removeVideo;
return this;
@ -384,7 +374,9 @@ public final class Transformer {
*
* <p>This method is experimental and may be removed or changed without warning.
*
* <p>To replace existing audio with silence, call {@link #setRemoveAudio(boolean)} as well.
* <p>To replace existing audio with silence, {@linkplain
* EditedMediaItem.Builder#setRemoveAudio(boolean) remove the audio} from the {@link
* EditedMediaItem} to transform.
*
* <p>Audio properties/format:
*
@ -721,8 +713,11 @@ public final class Transformer {
@Deprecated
public void startTransformation(MediaItem mediaItem, String path) {
EditedMediaItem editedMediaItem =
new EditedMediaItem(
mediaItem, new Effects(audioProcessors, videoEffects, frameProcessorFactory));
new EditedMediaItem.Builder(mediaItem)
.setRemoveAudio(removeAudio)
.setRemoveVideo(removeVideo)
.setEffects(new Effects(audioProcessors, videoEffects, frameProcessorFactory))
.build();
startTransformationInternal(editedMediaItem, path, /* parcelFileDescriptor= */ null);
}
@ -733,8 +728,11 @@ public final class Transformer {
@RequiresApi(26)
public void startTransformation(MediaItem mediaItem, ParcelFileDescriptor parcelFileDescriptor) {
EditedMediaItem editedMediaItem =
new EditedMediaItem(
mediaItem, new Effects(audioProcessors, videoEffects, frameProcessorFactory));
new EditedMediaItem.Builder(mediaItem)
.setRemoveAudio(removeAudio)
.setRemoveVideo(removeVideo)
.setEffects(new Effects(audioProcessors, videoEffects, frameProcessorFactory))
.build();
startTransformationInternal(editedMediaItem, /* path= */ null, parcelFileDescriptor);
}
@ -765,8 +763,6 @@ public final class Transformer {
path,
parcelFileDescriptor,
transformationRequest,
removeAudio,
removeVideo,
generateSilentAudio,
assetLoaderFactory,
encoderFactory,

View File

@ -118,8 +118,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
@Nullable String outputPath,
@Nullable ParcelFileDescriptor outputParcelFileDescriptor,
TransformationRequest transformationRequest,
boolean removeAudio,
boolean removeVideo,
boolean generateSilentAudio,
AssetLoader.Factory assetLoaderFactory,
Codec.EncoderFactory encoderFactory,
@ -144,8 +142,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
ComponentListener componentListener = new ComponentListener(mediaItem, fallbackListener);
assetLoader =
assetLoaderFactory
.setRemoveAudio(removeAudio)
.setRemoveVideo(removeVideo)
.setRemoveAudio(editedMediaItem.removeAudio)
.setRemoveVideo(editedMediaItem.removeVideo)
.setFlattenVideoForSlowMotion(transformationRequest.flattenForSlowMotion)
.createAssetLoader(mediaItem, internalLooper, componentListener);
effects = editedMediaItem.effects;

View File

@ -0,0 +1,41 @@
/*
* Copyright 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.media3.transformer;
import static org.junit.Assert.assertThrows;
import androidx.media3.common.MediaItem;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
/** Unit test for {@link EditedMediaItem.Builder}. */
@RunWith(AndroidJUnit4.class)
public final class EditedMediaItemBuilderTest {
@Test
public void build_removeAudioAndVideo_throws() {
MediaItem mediaItem = MediaItem.fromUri("uri");
assertThrows(
IllegalStateException.class,
() ->
new EditedMediaItem.Builder(mediaItem)
.setRemoveAudio(true)
.setRemoveVideo(true)
.build());
}
}

View File

@ -29,15 +29,6 @@ import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
public class TransformerBuilderTest {
@Test
public void build_removeAudioAndVideo_throws() {
Context context = ApplicationProvider.getApplicationContext();
assertThrows(
IllegalStateException.class,
() -> new Transformer.Builder(context).setRemoveAudio(true).setRemoveVideo(true).build());
}
@Test
public void build_withUnsupportedAudioMimeType_throws() {
Context context = ApplicationProvider.getApplicationContext();

View File

@ -131,7 +131,7 @@ public final class TransformerEndToEndTest {
public void startTransformation_videoOnlyPassthrough_completesSuccessfully() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -142,9 +142,8 @@ public final class TransformerEndToEndTest {
@Test
public void startTransformation_audioOnlyPassthrough_completesSuccessfully() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(
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();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -162,9 +161,8 @@ public final class TransformerEndToEndTest {
.setAudioMimeType(MimeTypes.AUDIO_AAC) // supported by encoder and muxer
.build())
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(
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();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -177,7 +175,7 @@ public final class TransformerEndToEndTest {
public void startTransformation_audioAndVideo_completesSuccessfully() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -199,7 +197,7 @@ public final class TransformerEndToEndTest {
.setStartsAtKeyFrame(true)
.build())
.build();
EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -218,7 +216,8 @@ public final class TransformerEndToEndTest {
new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build())
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SUBTITLES));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SUBTITLES))
.build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -231,7 +230,7 @@ public final class TransformerEndToEndTest {
throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
// Transform first media item.
transformer.startTransformation(editedMediaItem, outputPath);
@ -249,7 +248,7 @@ public final class TransformerEndToEndTest {
public void startTransformation_concurrentTransformations_throwsError() {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build();
transformer.startTransformation(editedMediaItem, outputPath);
@ -260,10 +259,11 @@ public final class TransformerEndToEndTest {
@Test
public void startTransformation_removeAudio_completesSuccessfully() throws Exception {
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ false).setRemoveAudio(true).build();
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO))
.setRemoveAudio(true)
.build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -274,10 +274,11 @@ public final class TransformerEndToEndTest {
@Test
public void startTransformation_removeVideo_completesSuccessfully() throws Exception {
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ false).setRemoveVideo(true).build();
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO))
.setRemoveVideo(true)
.build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -292,9 +293,8 @@ public final class TransformerEndToEndTest {
createTransformerBuilder(/* enableFallback= */ false)
.experimentalSetGenerateSilentAudio(true)
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(
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();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -310,7 +310,7 @@ public final class TransformerEndToEndTest {
.experimentalSetGenerateSilentAudio(true)
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -323,10 +323,11 @@ public final class TransformerEndToEndTest {
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ false)
.experimentalSetGenerateSilentAudio(true)
.setRemoveAudio(true)
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO))
.setRemoveAudio(true)
.build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -340,10 +341,11 @@ public final class TransformerEndToEndTest {
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ false)
.experimentalSetGenerateSilentAudio(true)
.setRemoveVideo(true)
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO))
.setRemoveVideo(true)
.build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -358,7 +360,7 @@ public final class TransformerEndToEndTest {
.experimentalSetGenerateSilentAudio(true)
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -375,7 +377,8 @@ public final class TransformerEndToEndTest {
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
ImmutableList<AudioProcessor> audioProcessors = ImmutableList.of(sonicAudioProcessor);
Effects effects = new Effects(audioProcessors, /* videoEffects= */ ImmutableList.of());
EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects);
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -396,7 +399,7 @@ public final class TransformerEndToEndTest {
.addListener(mockListener3)
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -419,9 +422,8 @@ public final class TransformerEndToEndTest {
.setTransformationRequest( // Request transcoding so that decoder is used.
new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build())
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(
MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER));
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformationException exception =
@ -451,8 +453,8 @@ public final class TransformerEndToEndTest {
.addListener(mockListener2)
.addListener(mockListener3)
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER));
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -488,7 +490,7 @@ public final class TransformerEndToEndTest {
.build();
Transformer transformer2 = transformer1.buildUpon().removeListener(mockListener2).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
transformer2.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer2);
@ -506,7 +508,8 @@ public final class TransformerEndToEndTest {
new TransformationRequest.Builder().setFlattenForSlowMotion(true).build())
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SEF_SLOW_MOTION));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SEF_SLOW_MOTION))
.build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -518,7 +521,7 @@ public final class TransformerEndToEndTest {
public void startTransformation_completesWithValidBitrate() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformationResult result = TransformerTestRunner.runLooper(transformer);
@ -537,8 +540,8 @@ public final class TransformerEndToEndTest {
MimeTypes.AUDIO_AMR_NB) // unsupported by encoder, supported by muxer
.build())
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER));
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformationException exception =
@ -558,9 +561,8 @@ public final class TransformerEndToEndTest {
.setAudioMimeType(MimeTypes.AUDIO_AAC) // supported by encoder and muxer
.build())
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(
MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER));
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformationException exception =
@ -575,7 +577,7 @@ public final class TransformerEndToEndTest {
public void startTransformation_withIoError_completesWithError() {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri("asset:///non-existing-path.mp4"));
new EditedMediaItem.Builder(MediaItem.fromUri("asset:///non-existing-path.mp4")).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformationException exception =
@ -596,8 +598,8 @@ public final class TransformerEndToEndTest {
new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build();
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ false).addListener(mockListener).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER));
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -621,8 +623,8 @@ public final class TransformerEndToEndTest {
new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build();
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ true).addListener(mockListener).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER));
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -651,7 +653,7 @@ public final class TransformerEndToEndTest {
.setMuxerFactory(muxerFactory)
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformationException exception =
@ -668,7 +670,7 @@ public final class TransformerEndToEndTest {
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ false).setMuxerFactory(muxerFactory).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -680,7 +682,7 @@ public final class TransformerEndToEndTest {
public void startTransformation_afterCancellation_completesSuccessfully() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
transformer.startTransformation(editedMediaItem, outputPath);
transformer.cancel();
@ -702,7 +704,7 @@ public final class TransformerEndToEndTest {
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ false).setLooper(looper).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
AtomicReference<Exception> exception = new AtomicReference<>();
CountDownLatch countDownLatch = new CountDownLatch(1);
@ -728,7 +730,7 @@ public final class TransformerEndToEndTest {
public void startTransformation_fromWrongThread_throwsError() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
HandlerThread anotherThread = new HandlerThread("AnotherThread");
AtomicReference<IllegalStateException> illegalStateException = new AtomicReference<>();
CountDownLatch countDownLatch = new CountDownLatch(1);
@ -760,7 +762,7 @@ public final class TransformerEndToEndTest {
new FakeAssetLoader.Factory(SUPPORTED_OUTPUT_TYPE_DECODED, sampleConsumerRef))
.build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
transformer.startTransformation(editedMediaItem, outputPath);
runLooperUntil(transformer.getApplicationLooper(), () -> sampleConsumerRef.get() != null);
@ -779,7 +781,8 @@ public final class TransformerEndToEndTest {
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
ImmutableList<AudioProcessor> audioProcessors = ImmutableList.of(new SonicAudioProcessor());
Effects effects = new Effects(audioProcessors, /* videoEffects= */ ImmutableList.of());
EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects);
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformationException transformationException =
@ -799,7 +802,8 @@ public final class TransformerEndToEndTest {
Presentation.createForHeight(mediaItemHeightPixels),
new ScaleToFitTransformation.Builder().build());
Effects effects = new Effects(ImmutableList.of(), videoEffects);
EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects);
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);
@ -812,7 +816,7 @@ public final class TransformerEndToEndTest {
public void getProgress_knownDuration_returnsConsistentStates() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build();
AtomicInteger previousProgressState =
new AtomicInteger(PROGRESS_STATE_WAITING_FOR_AVAILABILITY);
AtomicBoolean foundInconsistentState = new AtomicBoolean();
@ -859,7 +863,7 @@ public final class TransformerEndToEndTest {
public void getProgress_knownDuration_givesIncreasingPercentages() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build();
List<Integer> progresses = new ArrayList<>();
Handler progressHandler =
new Handler(Looper.myLooper()) {
@ -895,7 +899,7 @@ public final class TransformerEndToEndTest {
public void getProgress_noCurrentTransformation_returnsNoTransformation() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build();
@Transformer.ProgressState int stateBeforeTransform = transformer.getProgress(progressHolder);
transformer.startTransformation(editedMediaItem, outputPath);
@ -910,7 +914,8 @@ public final class TransformerEndToEndTest {
public void getProgress_unknownDuration_returnsConsistentStates() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_UNKNOWN_DURATION));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_UNKNOWN_DURATION))
.build();
AtomicInteger previousProgressState =
new AtomicInteger(PROGRESS_STATE_WAITING_FOR_AVAILABILITY);
AtomicBoolean foundInconsistentState = new AtomicBoolean();
@ -978,7 +983,7 @@ public final class TransformerEndToEndTest {
public void cancel_afterCompletion_doesNotThrow() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY));
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build();
transformer.startTransformation(editedMediaItem, outputPath);
TransformerTestRunner.runLooper(transformer);