Transformer: Move required Builder context to be a constructor arg.

Deprecates setContext() and moves the required Context arg into the constructor.

This way, the parameter can later be final and non-null, per the comment at:
79f03bb135/depot/google3/third_party/java_src/android_libs/media/libraries/transformer/src/main/java/androidx/media3/transformer/TranscodingTransformer.java (97L)

Also, fixes setOutputMimeType_unsupportedMimeType_throws by providing a context
in the builder, and updating the FrameworkMuxer#supportsOutputMimeType to catch
IllegalArgumentExceptions thrown by FrameworkMuxer#mimeTypeToMuxerOutputFormat.

PiperOrigin-RevId: 412053564
This commit is contained in:
huangdarwin 2021-11-24 15:30:07 +00:00 committed by tonihei
parent f637bb3d40
commit c18cbf1b22
9 changed files with 66 additions and 58 deletions

View File

@ -30,8 +30,7 @@ public class RemoveAudioTransformationTest {
@Test
public void removeAudioTransform() throws Exception {
Context context = ApplicationProvider.getApplicationContext();
Transformer transformer =
new Transformer.Builder().setContext(context).setRemoveAudio(true).build();
Transformer transformer = new Transformer.Builder(context).setRemoveAudio(true).build();
runTransformer(context, transformer, MP4_ASSET_URI_STRING, /* timeoutSeconds= */ 120);
}
}

View File

@ -30,8 +30,7 @@ public class RemoveVideoTransformationTest {
@Test
public void removeVideoTransform() throws Exception {
Context context = ApplicationProvider.getApplicationContext();
Transformer transformer =
new Transformer.Builder().setContext(context).setRemoveVideo(true).build();
Transformer transformer = new Transformer.Builder(context).setRemoveVideo(true).build();
runTransformer(context, transformer, MP4_ASSET_URI_STRING, /* timeoutSeconds= */ 120);
}
}

View File

@ -39,8 +39,7 @@ public final class RepeatedTranscodeTransformationTest {
public void repeatedTranscode_givesConsistentLengthOutput() throws Exception {
Context context = ApplicationProvider.getApplicationContext();
Transformer transformer =
new Transformer.Builder()
.setContext(context)
new Transformer.Builder(context)
.setVideoMimeType(MimeTypes.VIDEO_H265)
.setAudioMimeType(MimeTypes.AUDIO_AMR_NB)
.build();
@ -67,8 +66,7 @@ public final class RepeatedTranscodeTransformationTest {
public void repeatedTranscodeNoAudio_givesConsistentLengthOutput() throws Exception {
Context context = ApplicationProvider.getApplicationContext();
Transformer transformer =
new Transformer.Builder()
.setContext(context)
new Transformer.Builder(context)
.setVideoMimeType(MimeTypes.VIDEO_H265)
.setRemoveAudio(true)
.build();
@ -95,8 +93,7 @@ public final class RepeatedTranscodeTransformationTest {
public void repeatedTranscodeNoVideo_givesConsistentLengthOutput() throws Exception {
Context context = ApplicationProvider.getApplicationContext();
Transformer transcodingTransformer =
new Transformer.Builder()
.setContext(context)
new Transformer.Builder(context)
.setAudioMimeType(MimeTypes.AUDIO_AMR_NB)
.setRemoveVideo(true)
.build();

View File

@ -31,7 +31,7 @@ public class SefTransformationTest {
public void sefTransform() throws Exception {
Context context = ApplicationProvider.getApplicationContext();
Transformer transformer =
new Transformer.Builder().setContext(context).setFlattenForSlowMotion(true).build();
new Transformer.Builder(context).setFlattenForSlowMotion(true).build();
runTransformer(context, transformer, SEF_ASSET_URI_STRING, /* timeoutSeconds= */ 120);
}
}

View File

@ -30,7 +30,7 @@ public class TransformationTest {
@Test
public void transform() throws Exception {
Context context = ApplicationProvider.getApplicationContext();
Transformer transformer = new Transformer.Builder().setContext(context).build();
Transformer transformer = new Transformer.Builder(context).build();
runTransformer(context, transformer, MP4_ASSET_URI_STRING, /* timeoutSeconds= */ 120);
}
}

View File

@ -61,7 +61,7 @@ import java.nio.ByteBuffer;
public boolean supportsOutputMimeType(String mimeType) {
try {
mimeTypeToMuxerOutputFormat(mimeType);
} catch (IllegalStateException e) {
} catch (IllegalArgumentException e) {
return false;
}
return true;

View File

@ -18,7 +18,6 @@ package androidx.media3.transformer;
import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.common.util.Assertions.checkState;
import static androidx.media3.common.util.Assertions.checkStateNotNull;
import static androidx.media3.exoplayer.DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS;
import static androidx.media3.exoplayer.DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS;
import static androidx.media3.exoplayer.DefaultLoadControl.DEFAULT_MAX_BUFFER_MS;
@ -92,6 +91,8 @@ public final class Transformer {
public static final class Builder {
// Mandatory field.
// TODO(huangdarwin): Update @MonotonicNonNull to final after deprecated {@link
// #setContext(Context)} is removed.
private @MonotonicNonNull Context context;
// Optional fields.
@ -108,7 +109,12 @@ public final class Transformer {
private Looper looper;
private Clock clock;
/** Creates a builder with default values. */
/**
* Creates a builder with default values.
*
* @deprecated Use {@link #Builder(Context)} instead.
*/
@Deprecated
public Builder() {
muxerFactory = new FrameworkMuxer.Factory();
outputHeight = Transformation.NO_VALUE;
@ -118,6 +124,22 @@ public final class Transformer {
clock = Clock.DEFAULT;
}
/**
* Creates a builder with default values.
*
* @param context The {@link Context}.
* @throws NullPointerException If the {@link Context} has not been provided.
*/
public Builder(Context context) {
this.context = context.getApplicationContext();
muxerFactory = new FrameworkMuxer.Factory();
outputHeight = Transformation.NO_VALUE;
containerMimeType = MimeTypes.VIDEO_MP4;
listener = new Listener() {};
looper = Util.getCurrentOrMainLooper();
clock = Clock.DEFAULT;
}
/** Creates a builder with the values of the provided {@link Transformer}. */
private Builder(Transformer transformer) {
this.context = transformer.context;
@ -142,7 +164,9 @@ public final class Transformer {
*
* @param context The {@link Context}.
* @return This builder.
* @deprecated Use {@link #Builder(Context)} instead.
*/
@Deprecated
public Builder setContext(Context context) {
this.context = context.getApplicationContext();
return this;
@ -150,8 +174,8 @@ public final class Transformer {
/**
* Sets the {@link MediaSourceFactory} to be used to retrieve the inputs to transform. The
* default value is a {@link DefaultMediaSourceFactory} built with the context provided in
* {@link #setContext(Context)}.
* default value is a {@link DefaultMediaSourceFactory} built with the context provided in the
* constructor.
*
* @param mediaSourceFactory A {@link MediaSourceFactory}.
* @return This builder.
@ -368,7 +392,7 @@ public final class Transformer {
/**
* Builds a {@link Transformer} instance.
*
* @throws IllegalStateException If the {@link Context} has not been provided.
* @throws NullPointerException If the {@link Context} has not been provided.
* @throws IllegalStateException If both audio and video have been removed (otherwise the output
* would not contain any samples).
* @throws IllegalStateException If the muxer doesn't support the requested container MIME type.
@ -376,7 +400,9 @@ public final class Transformer {
* @throws IllegalStateException If the muxer doesn't support the requested video MIME type.
*/
public Transformer build() {
checkStateNotNull(context);
// TODO(huangdarwin): Remove this checkNotNull after deprecated {@link #setContext(Context)}
// is removed.
checkNotNull(context);
if (mediaSourceFactory == null) {
DefaultExtractorsFactory defaultExtractorsFactory = new DefaultExtractorsFactory();
if (flattenForSlowMotion) {

View File

@ -31,14 +31,16 @@ public class TransformerBuilderTest {
@Test
public void setOutputMimeType_unsupportedMimeType_throws() {
Context context = ApplicationProvider.getApplicationContext();
assertThrows(
IllegalStateException.class,
() -> new Transformer.Builder().setOutputMimeType(MimeTypes.VIDEO_FLV).build());
() -> new Transformer.Builder(context).setOutputMimeType(MimeTypes.VIDEO_UNKNOWN).build());
}
@Test
public void build_withoutContext_throws() {
assertThrows(IllegalStateException.class, () -> new Transformer.Builder().build());
assertThrows(NullPointerException.class, () -> new Transformer.Builder().build());
}
@Test
@ -47,11 +49,6 @@ public class TransformerBuilderTest {
assertThrows(
IllegalStateException.class,
() ->
new Transformer.Builder()
.setContext(context)
.setRemoveAudio(true)
.setRemoveVideo(true)
.build());
() -> new Transformer.Builder(context).setRemoveAudio(true).setRemoveVideo(true).build());
}
}

View File

@ -92,8 +92,7 @@ public final class TransformerTest {
@Test
public void startTransformation_videoOnly_completesSuccessfully() throws Exception {
Transformer transformer =
new Transformer.Builder()
.setContext(context)
new Transformer.Builder(context)
.setClock(clock)
.setMuxerFactory(new TestMuxerFactory())
.build();
@ -108,8 +107,7 @@ public final class TransformerTest {
@Test
public void startTransformation_audioOnly_completesSuccessfully() throws Exception {
Transformer transformer =
new Transformer.Builder()
.setContext(context)
new Transformer.Builder(context)
.setClock(clock)
.setMuxerFactory(new TestMuxerFactory())
.build();
@ -124,8 +122,7 @@ public final class TransformerTest {
@Test
public void startTransformation_audioAndVideo_completesSuccessfully() throws Exception {
Transformer transformer =
new Transformer.Builder()
.setContext(context)
new Transformer.Builder(context)
.setClock(clock)
.setMuxerFactory(new TestMuxerFactory())
.build();
@ -140,8 +137,7 @@ public final class TransformerTest {
@Test
public void startTransformation_withSubtitles_completesSuccessfully() throws Exception {
Transformer transformer =
new Transformer.Builder()
.setContext(context)
new Transformer.Builder(context)
.setClock(clock)
.setMuxerFactory(new TestMuxerFactory())
.build();
@ -157,8 +153,7 @@ public final class TransformerTest {
public void startTransformation_successiveTransformations_completesSuccessfully()
throws Exception {
Transformer transformer =
new Transformer.Builder()
.setContext(context)
new Transformer.Builder(context)
.setClock(clock)
.setMuxerFactory(new TestMuxerFactory())
.build();
@ -178,7 +173,7 @@ public final class TransformerTest {
@Test
public void startTransformation_concurrentTransformations_throwsError() throws Exception {
Transformer transformer = new Transformer.Builder().setContext(context).setClock(clock).build();
Transformer transformer = new Transformer.Builder(context).setClock(clock).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_VIDEO_ONLY);
transformer.startTransformation(mediaItem, outputPath);
@ -190,8 +185,7 @@ public final class TransformerTest {
@Test
public void startTransformation_removeAudio_completesSuccessfully() throws Exception {
Transformer transformer =
new Transformer.Builder()
.setContext(context)
new Transformer.Builder(context)
.setRemoveAudio(true)
.setClock(clock)
.setMuxerFactory(new TestMuxerFactory())
@ -208,8 +202,7 @@ public final class TransformerTest {
@Test
public void startTransformation_removeVideo_completesSuccessfully() throws Exception {
Transformer transformer =
new Transformer.Builder()
.setContext(context)
new Transformer.Builder(context)
.setRemoveVideo(true)
.setClock(clock)
.setMuxerFactory(new TestMuxerFactory())
@ -226,8 +219,7 @@ public final class TransformerTest {
@Test
public void startTransformation_flattenForSlowMotion_completesSuccessfully() throws Exception {
Transformer transformer =
new Transformer.Builder()
.setContext(context)
new Transformer.Builder(context)
.setFlattenForSlowMotion(true)
.setClock(clock)
.setMuxerFactory(new TestMuxerFactory())
@ -242,7 +234,7 @@ public final class TransformerTest {
@Test
public void startTransformation_withPlayerError_completesWithError() throws Exception {
Transformer transformer = new Transformer.Builder().setContext(context).setClock(clock).build();
Transformer transformer = new Transformer.Builder(context).setClock(clock).build();
MediaItem mediaItem = MediaItem.fromUri("asset:///non-existing-path.mp4");
transformer.startTransformation(mediaItem, outputPath);
@ -255,7 +247,7 @@ public final class TransformerTest {
@Test
public void startTransformation_withAllSampleFormatsUnsupported_completesWithError()
throws Exception {
Transformer transformer = new Transformer.Builder().setContext(context).setClock(clock).build();
Transformer transformer = new Transformer.Builder(context).setClock(clock).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_WITH_ALL_SAMPLE_FORMATS_UNSUPPORTED);
transformer.startTransformation(mediaItem, outputPath);
@ -267,8 +259,7 @@ public final class TransformerTest {
@Test
public void startTransformation_afterCancellation_completesSuccessfully() throws Exception {
Transformer transformer =
new Transformer.Builder()
.setContext(context)
new Transformer.Builder(context)
.setClock(clock)
.setMuxerFactory(new TestMuxerFactory())
.build();
@ -291,8 +282,7 @@ public final class TransformerTest {
anotherThread.start();
Looper looper = anotherThread.getLooper();
Transformer transformer =
new Transformer.Builder()
.setContext(context)
new Transformer.Builder(context)
.setLooper(looper)
.setClock(clock)
.setMuxerFactory(new TestMuxerFactory())
@ -321,7 +311,7 @@ public final class TransformerTest {
@Test
public void startTransformation_fromWrongThread_throwsError() throws Exception {
Transformer transformer = new Transformer.Builder().setContext(context).setClock(clock).build();
Transformer transformer = new Transformer.Builder(context).setClock(clock).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_ONLY);
HandlerThread anotherThread = new HandlerThread("AnotherThread");
AtomicReference<IllegalStateException> illegalStateException = new AtomicReference<>();
@ -348,7 +338,7 @@ public final class TransformerTest {
@Test
public void getProgress_knownDuration_returnsConsistentStates() throws Exception {
Transformer transformer = new Transformer.Builder().setContext(context).setClock(clock).build();
Transformer transformer = new Transformer.Builder(context).setClock(clock).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_VIDEO_ONLY);
AtomicInteger previousProgressState =
new AtomicInteger(PROGRESS_STATE_WAITING_FOR_AVAILABILITY);
@ -394,7 +384,7 @@ public final class TransformerTest {
@Test
public void getProgress_knownDuration_givesIncreasingPercentages() throws Exception {
Transformer transformer = new Transformer.Builder().setContext(context).setClock(clock).build();
Transformer transformer = new Transformer.Builder(context).setClock(clock).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_VIDEO_ONLY);
List<Integer> progresses = new ArrayList<>();
Handler progressHandler =
@ -429,7 +419,7 @@ public final class TransformerTest {
@Test
public void getProgress_noCurrentTransformation_returnsNoTransformation() throws Exception {
Transformer transformer = new Transformer.Builder().setContext(context).setClock(clock).build();
Transformer transformer = new Transformer.Builder(context).setClock(clock).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_VIDEO_ONLY);
@Transformer.ProgressState int stateBeforeTransform = transformer.getProgress(progressHolder);
@ -443,7 +433,7 @@ public final class TransformerTest {
@Test
public void getProgress_unknownDuration_returnsConsistentStates() throws Exception {
Transformer transformer = new Transformer.Builder().setContext(context).setClock(clock).build();
Transformer transformer = new Transformer.Builder(context).setClock(clock).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_UNKNOWN_DURATION);
AtomicInteger previousProgressState =
new AtomicInteger(PROGRESS_STATE_WAITING_FOR_AVAILABILITY);
@ -486,7 +476,7 @@ public final class TransformerTest {
@Test
public void getProgress_fromWrongThread_throwsError() throws Exception {
Transformer transformer = new Transformer.Builder().setContext(context).setClock(clock).build();
Transformer transformer = new Transformer.Builder(context).setClock(clock).build();
HandlerThread anotherThread = new HandlerThread("AnotherThread");
AtomicReference<IllegalStateException> illegalStateException = new AtomicReference<>();
CountDownLatch countDownLatch = new CountDownLatch(1);
@ -510,7 +500,7 @@ public final class TransformerTest {
@Test
public void cancel_afterCompletion_doesNotThrow() throws Exception {
Transformer transformer = new Transformer.Builder().setContext(context).setClock(clock).build();
Transformer transformer = new Transformer.Builder(context).setClock(clock).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_VIDEO_ONLY);
transformer.startTransformation(mediaItem, outputPath);
@ -520,7 +510,7 @@ public final class TransformerTest {
@Test
public void cancel_fromWrongThread_throwsError() throws Exception {
Transformer transformer = new Transformer.Builder().setContext(context).setClock(clock).build();
Transformer transformer = new Transformer.Builder(context).setClock(clock).build();
HandlerThread anotherThread = new HandlerThread("AnotherThread");
AtomicReference<IllegalStateException> illegalStateException = new AtomicReference<>();
CountDownLatch countDownLatch = new CountDownLatch(1);