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:
parent
f637bb3d40
commit
c18cbf1b22
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user