From 2eaece5ed9021b36e6fa745d8b9daae882bd7a23 Mon Sep 17 00:00:00 2001 From: sheenachhabra Date: Mon, 25 Mar 2024 10:58:51 -0700 Subject: [PATCH] Move setMaxDelayBetweenSamplesMs on Transformer builder This property is transformer specific and does not belong to muxer interface. This is to eventually replace muxer interface in Transformer module with muxer interface in Muxer module. PiperOrigin-RevId: 618895836 --- .../demo/transformer/TransformerActivity.java | 11 ++-- .../TransformerPauseResumeTest.java | 5 -- .../media3/transformer/DefaultMuxer.java | 30 ++--------- .../media3/transformer/ExportException.java | 2 +- .../media3/transformer/FrameworkMuxer.java | 17 ++----- .../media3/transformer/InAppMuxer.java | 29 ++--------- .../androidx/media3/transformer/Muxer.java | 12 ----- .../media3/transformer/MuxerWrapper.java | 8 ++- .../media3/transformer/Transformer.java | 49 +++++++++++++++--- .../media3/transformer/CapturingMuxer.java | 11 +--- .../EncodedSampleExporterTest.java | 3 +- .../transformer/MediaItemExportTest.java | 15 +++--- .../media3/transformer/MuxerWrapperTest.java | 51 ++++++++++++------- .../transformer/TransformerUtilTest.java | 6 ++- 14 files changed, 111 insertions(+), 138 deletions(-) diff --git a/demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java b/demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java index 58ce6ca4c5..b28154fbd0 100644 --- a/demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java +++ b/demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java @@ -326,18 +326,13 @@ public final class TransformerActivity extends AppCompatActivity { .setEnableFallback(bundle.getBoolean(ConfigurationActivity.ENABLE_FALLBACK)) .build()); - long maxDelayBetweenSamplesMs = DefaultMuxer.Factory.DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS; if (!bundle.getBoolean(ConfigurationActivity.ABORT_SLOW_EXPORT)) { - maxDelayBetweenSamplesMs = C.TIME_UNSET; + transformerBuilder.setMaxDelayBetweenMuxerSamplesMs(C.TIME_UNSET); } - Muxer.Factory muxerFactory = new DefaultMuxer.Factory(maxDelayBetweenSamplesMs); + Muxer.Factory muxerFactory = new DefaultMuxer.Factory(); if (bundle.getBoolean(ConfigurationActivity.PRODUCE_FRAGMENTED_MP4)) { - muxerFactory = - new InAppMuxer.Factory.Builder() - .setMaxDelayBetweenSamplesMs(maxDelayBetweenSamplesMs) - .setFragmentedMp4Enabled(true) - .build(); + muxerFactory = new InAppMuxer.Factory.Builder().setFragmentedMp4Enabled(true).build(); } transformerBuilder.setMuxerFactory(muxerFactory); diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerPauseResumeTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerPauseResumeTest.java index cc8491c070..261c9bd9f0 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerPauseResumeTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerPauseResumeTest.java @@ -471,10 +471,5 @@ public class TransformerPauseResumeTest { public void release(boolean forCancellation) throws MuxerException { wrappedMuxer.release(forCancellation); } - - @Override - public long getMaxDelayBetweenSamplesMs() { - return wrappedMuxer.getMaxDelayBetweenSamplesMs(); - } } } diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultMuxer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultMuxer.java index 3296f3690d..62f4d9c2c5 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultMuxer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultMuxer.java @@ -28,39 +28,22 @@ public final class DefaultMuxer implements Muxer { /** A {@link Muxer.Factory} for {@link DefaultMuxer}. */ public static final class Factory implements Muxer.Factory { - - /** The default value returned by {@link #getMaxDelayBetweenSamplesMs()}. */ - public static final long DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS = 10_000; - private final Muxer.Factory muxerFactory; - /** - * Creates an instance with {@link Muxer#getMaxDelayBetweenSamplesMs() maxDelayBetweenSamplesMs} - * set to {@link #DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS}. - */ + /** Creates an instance with {@code videoDurationMs} set to {@link C#TIME_UNSET}. */ public Factory() { - this(/* maxDelayBetweenSamplesMs= */ DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS); + this(/* videoDurationMs= */ C.TIME_UNSET); } /** * Creates an instance. * - * @param maxDelayBetweenSamplesMs See {@link Muxer#getMaxDelayBetweenSamplesMs()}. - */ - public Factory(long maxDelayBetweenSamplesMs) { - this(maxDelayBetweenSamplesMs, /* videoDurationMs= */ C.TIME_UNSET); - } - - /** - * Creates an instance. - * - * @param maxDelayBetweenSamplesMs See {@link Muxer#getMaxDelayBetweenSamplesMs()}. * @param videoDurationMs The duration of the video track (in milliseconds) to enforce in the * output, or {@link C#TIME_UNSET} to not enforce. Only applicable when a video track is * {@linkplain #addTrack(Format) added}. */ - public Factory(long maxDelayBetweenSamplesMs, long videoDurationMs) { - this.muxerFactory = new FrameworkMuxer.Factory(maxDelayBetweenSamplesMs, videoDurationMs); + public Factory(long videoDurationMs) { + this.muxerFactory = new FrameworkMuxer.Factory(videoDurationMs); } @Override @@ -101,9 +84,4 @@ public final class DefaultMuxer implements Muxer { public void release(boolean forCancellation) throws MuxerException { muxer.release(forCancellation); } - - @Override - public long getMaxDelayBetweenSamplesMs() { - return muxer.getMaxDelayBetweenSamplesMs(); - } } diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/ExportException.java b/libraries/transformer/src/main/java/androidx/media3/transformer/ExportException.java index 68b572f6d9..08ba0b42c3 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/ExportException.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/ExportException.java @@ -181,7 +181,7 @@ public final class ExportException extends Exception { /** * Caused by a timeout while muxing media samples. * - * @see Muxer#getMaxDelayBetweenSamplesMs() + * @see Transformer.Builder#setMaxDelayBetweenMuxerSamplesMs(long) */ public static final int ERROR_CODE_MUXING_TIMEOUT = 7002; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/FrameworkMuxer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/FrameworkMuxer.java index c63d8148f6..cb5393525e 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/FrameworkMuxer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/FrameworkMuxer.java @@ -47,12 +47,9 @@ import java.nio.ByteBuffer; /** {@link Muxer.Factory} for {@link FrameworkMuxer}. */ public static final class Factory implements Muxer.Factory { - - private final long maxDelayBetweenSamplesMs; private final long videoDurationMs; - public Factory(long maxDelayBetweenSamplesMs, long videoDurationMs) { - this.maxDelayBetweenSamplesMs = maxDelayBetweenSamplesMs; + public Factory(long videoDurationMs) { this.videoDurationMs = videoDurationMs; } @@ -64,7 +61,7 @@ import java.nio.ByteBuffer; } catch (IOException e) { throw new MuxerException("Error creating muxer", e); } - return new FrameworkMuxer(mediaMuxer, maxDelayBetweenSamplesMs, videoDurationMs); + return new FrameworkMuxer(mediaMuxer, videoDurationMs); } @Override @@ -79,7 +76,6 @@ import java.nio.ByteBuffer; } private final MediaMuxer mediaMuxer; - private final long maxDelayBetweenSamplesMs; private final long videoDurationUs; private final MediaCodec.BufferInfo bufferInfo; private final SparseLongArray trackIndexToLastPresentationTimeUs; @@ -89,10 +85,8 @@ import java.nio.ByteBuffer; private boolean isStarted; - private FrameworkMuxer( - MediaMuxer mediaMuxer, long maxDelayBetweenSamplesMs, long videoDurationMs) { + private FrameworkMuxer(MediaMuxer mediaMuxer, long videoDurationMs) { this.mediaMuxer = mediaMuxer; - this.maxDelayBetweenSamplesMs = maxDelayBetweenSamplesMs; this.videoDurationUs = Util.msToUs(videoDurationMs); bufferInfo = new MediaCodec.BufferInfo(); trackIndexToLastPresentationTimeUs = new SparseLongArray(); @@ -236,11 +230,6 @@ import java.nio.ByteBuffer; } } - @Override - public long getMaxDelayBetweenSamplesMs() { - return maxDelayBetweenSamplesMs; - } - // Accesses MediaMuxer state via reflection to ensure that muxer resources can be released even // if stopping fails. @SuppressLint("PrivateApi") diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/InAppMuxer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/InAppMuxer.java index 6b27e605fb..5ea8111e03 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/InAppMuxer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/InAppMuxer.java @@ -62,24 +62,15 @@ public final class InAppMuxer implements Muxer { /** A builder for {@link Factory} instances. */ public static final class Builder { - private long maxDelayBetweenSamplesMs; private @Nullable MetadataProvider metadataProvider; private boolean fragmentedMp4Enabled; private int fragmentDurationUs; /** Creates a {@link Builder} instance with default values. */ public Builder() { - maxDelayBetweenSamplesMs = DefaultMuxer.Factory.DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS; fragmentDurationUs = Mp4Muxer.DEFAULT_FRAGMENT_DURATION_US; } - /** See {@link Muxer#getMaxDelayBetweenSamplesMs()}. */ - @CanIgnoreReturnValue - public Builder setMaxDelayBetweenSamplesMs(long maxDelayBetweenSamplesMs) { - this.maxDelayBetweenSamplesMs = maxDelayBetweenSamplesMs; - return this; - } - /** * Sets an implementation of {@link MetadataProvider}. * @@ -110,22 +101,18 @@ public final class InAppMuxer implements Muxer { /** Builds a {@link Factory} instance. */ public Factory build() { - return new Factory( - maxDelayBetweenSamplesMs, metadataProvider, fragmentedMp4Enabled, fragmentDurationUs); + return new Factory(metadataProvider, fragmentedMp4Enabled, fragmentDurationUs); } } - private final long maxDelayBetweenSamplesMs; private final @Nullable MetadataProvider metadataProvider; private final boolean fragmentedMp4Enabled; private final int fragmentDurationUs; private Factory( - long maxDelayBetweenSamplesMs, @Nullable MetadataProvider metadataProvider, boolean fragmentedMp4Enabled, int fragmentDurationUs) { - this.maxDelayBetweenSamplesMs = maxDelayBetweenSamplesMs; this.metadataProvider = metadataProvider; this.fragmentedMp4Enabled = fragmentedMp4Enabled; this.fragmentDurationUs = fragmentDurationUs; @@ -145,7 +132,7 @@ public final class InAppMuxer implements Muxer { .setFragmentedMp4Enabled(fragmentedMp4Enabled) .setFragmentDurationUs(fragmentDurationUs) .build(); - return new InAppMuxer(mp4Muxer, maxDelayBetweenSamplesMs, metadataProvider); + return new InAppMuxer(mp4Muxer, metadataProvider); } @Override @@ -160,18 +147,13 @@ public final class InAppMuxer implements Muxer { } private final Mp4Muxer mp4Muxer; - private final long maxDelayBetweenSamplesMs; private final @Nullable MetadataProvider metadataProvider; private final List trackTokenList; private final BufferInfo bufferInfo; private final Set metadataEntries; - private InAppMuxer( - Mp4Muxer mp4Muxer, - long maxDelayBetweenSamplesMs, - @Nullable MetadataProvider metadataProvider) { + private InAppMuxer(Mp4Muxer mp4Muxer, @Nullable MetadataProvider metadataProvider) { this.mp4Muxer = mp4Muxer; - this.maxDelayBetweenSamplesMs = maxDelayBetweenSamplesMs; this.metadataProvider = metadataProvider; trackTokenList = new ArrayList<>(); bufferInfo = new BufferInfo(); @@ -247,11 +229,6 @@ public final class InAppMuxer implements Muxer { } } - @Override - public long getMaxDelayBetweenSamplesMs() { - return maxDelayBetweenSamplesMs; - } - private void writeMetadata() { if (metadataProvider != null) { Set metadataEntriesCopy = new LinkedHashSet<>(metadataEntries); diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/Muxer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/Muxer.java index f2ffce0e58..a37a44be8c 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/Muxer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/Muxer.java @@ -104,16 +104,4 @@ public interface Muxer { * forCancellation} is false. */ void release(boolean forCancellation) throws MuxerException; - - /** - * Returns the maximum delay allowed between output samples, in milliseconds, or {@link - * C#TIME_UNSET} if there is no maximum. - * - *

This is the maximum delay between samples of any track. They can be of the same or of - * different track types. - * - *

This value is used to abort the export when the maximum delay is reached. Note that there is - * no guarantee that the export will be aborted exactly at that time. - */ - long getMaxDelayBetweenSamplesMs(); } diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/MuxerWrapper.java b/libraries/transformer/src/main/java/androidx/media3/transformer/MuxerWrapper.java index 6bda3fd8a9..ed31a14f79 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/MuxerWrapper.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/MuxerWrapper.java @@ -145,6 +145,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private final SparseArray trackTypeToInfo; private final ScheduledExecutorService abortScheduledExecutorService; private final @MonotonicNonNull Format appendVideoFormat; + private final long maxDelayBetweenSamplesMs; private boolean isReady; private boolean isEnded; @@ -177,6 +178,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * presentation timestamps before the first video sample. * @param appendVideoFormat The format which will be used to write samples after transitioning * from {@link #MUXER_MODE_MUX_PARTIAL} to {@link #MUXER_MODE_APPEND}. + * @param maxDelayBetweenSamplesMs The maximum delay allowed between output samples regardless of + * the track type, or {@link C#TIME_UNSET} if there is no maximum. */ public MuxerWrapper( String outputPath, @@ -184,7 +187,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; Listener listener, @MuxerMode int muxerMode, boolean dropSamplesBeforeFirstVideoSample, - @Nullable Format appendVideoFormat) { + @Nullable Format appendVideoFormat, + long maxDelayBetweenSamplesMs) { this.outputPath = outputPath; this.muxerFactory = muxerFactory; this.listener = listener; @@ -196,6 +200,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; || (muxerMode == MUXER_MODE_MUX_PARTIAL && appendVideoFormat != null), "appendVideoFormat must be present if and only if muxerMode is MUXER_MODE_MUX_PARTIAL."); this.appendVideoFormat = appendVideoFormat; + this.maxDelayBetweenSamplesMs = maxDelayBetweenSamplesMs; trackTypeToInfo = new SparseArray<>(); previousTrackType = C.TRACK_TYPE_NONE; firstVideoPresentationTimeUs = C.TIME_UNSET; @@ -673,7 +678,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private void resetAbortTimer() { checkStateNotNull(muxer); - long maxDelayBetweenSamplesMs = muxer.getMaxDelayBetweenSamplesMs(); if (maxDelayBetweenSamplesMs == C.TIME_UNSET) { return; } diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java index 9399b50e7c..b5d9489bf5 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java @@ -112,6 +112,7 @@ public final class Transformer { private boolean flattenForSlowMotion; private boolean trimOptimizationEnabled; private boolean fileStartsOnVideoFrameEnabled; + private long maxDelayBetweenMuxerSamplesMs; private ListenerSet listeners; private AssetLoader.@MonotonicNonNull Factory assetLoaderFactory; private AudioMixer.Factory audioMixerFactory; @@ -129,6 +130,7 @@ public final class Transformer { */ public Builder(Context context) { this.context = context.getApplicationContext(); + maxDelayBetweenMuxerSamplesMs = DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS; audioProcessors = ImmutableList.of(); videoEffects = ImmutableList.of(); audioMixerFactory = new DefaultAudioMixer.Factory(); @@ -153,6 +155,7 @@ public final class Transformer { this.removeVideo = transformer.removeVideo; this.trimOptimizationEnabled = transformer.trimOptimizationEnabled; this.fileStartsOnVideoFrameEnabled = transformer.fileStartsOnVideoFrameEnabled; + this.maxDelayBetweenMuxerSamplesMs = transformer.maxDelayBetweenMuxerSamplesMs; this.listeners = transformer.listeners; this.assetLoaderFactory = transformer.assetLoaderFactory; this.audioMixerFactory = transformer.audioMixerFactory; @@ -329,7 +332,7 @@ public final class Transformer { } /** - * Set whether to ensure that the output file starts on a video frame. + * Sets whether to ensure that the output file starts on a video frame. * *

Any audio samples that are earlier than the first video frame will be dropped. This can * make the output of trimming operations more compatible with player implementations that don't @@ -347,6 +350,24 @@ public final class Transformer { return this; } + /** + * Sets the maximum delay allowed between output samples regardless of the track type, or {@link + * C#TIME_UNSET} if there is no maximum. The default value is {@link + * #DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS}. + * + *

The export will be aborted when no sample is written in {@code + * maxDelayBetweenMuxerSamplesMs}. Note that there is no guarantee that the export will be + * aborted exactly at that time. + * + * @param maxDelayBetweenMuxerSamplesMs The maximum delay allowed (in microseconds). + * @return This builder. + */ + @CanIgnoreReturnValue + public Builder setMaxDelayBetweenMuxerSamplesMs(long maxDelayBetweenMuxerSamplesMs) { + this.maxDelayBetweenMuxerSamplesMs = maxDelayBetweenMuxerSamplesMs; + return this; + } + /** * @deprecated Use {@link #addListener(Listener)}, {@link #removeListener(Listener)} or {@link * #removeAllListeners()} instead. @@ -564,6 +585,7 @@ public final class Transformer { flattenForSlowMotion, trimOptimizationEnabled, fileStartsOnVideoFrameEnabled, + maxDelayBetweenMuxerSamplesMs, listeners, assetLoaderFactory, audioMixerFactory, @@ -730,6 +752,12 @@ public final class Transformer { /** Indicates that the progress is permanently unavailable. */ public static final int PROGRESS_STATE_UNAVAILABLE = 3; + /** + * The default value for the {@linkplain Builder#setMaxDelayBetweenMuxerSamplesMs maximum delay + * between output samples}. + */ + public static final long DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS = 10_000; + @Documented @Retention(RetentionPolicy.SOURCE) @Target(TYPE_USE) @@ -808,6 +836,8 @@ public final class Transformer { private final boolean flattenForSlowMotion; private final boolean trimOptimizationEnabled; private final boolean fileStartsOnVideoFrameEnabled; + private final long maxDelayBetweenMuxerSamplesMs; + private final ListenerSet listeners; @Nullable private final AssetLoader.Factory assetLoaderFactory; private final AudioMixer.Factory audioMixerFactory; @@ -843,6 +873,7 @@ public final class Transformer { boolean flattenForSlowMotion, boolean trimOptimizationEnabled, boolean fileStartsOnVideoFrameEnabled, + long maxDelayBetweenMuxerSamplesMs, ListenerSet listeners, @Nullable AssetLoader.Factory assetLoaderFactory, AudioMixer.Factory audioMixerFactory, @@ -862,6 +893,7 @@ public final class Transformer { this.flattenForSlowMotion = flattenForSlowMotion; this.trimOptimizationEnabled = trimOptimizationEnabled; this.fileStartsOnVideoFrameEnabled = fileStartsOnVideoFrameEnabled; + this.maxDelayBetweenMuxerSamplesMs = maxDelayBetweenMuxerSamplesMs; this.listeners = listeners; this.assetLoaderFactory = assetLoaderFactory; this.audioMixerFactory = audioMixerFactory; @@ -1006,7 +1038,8 @@ public final class Transformer { componentListener, MuxerWrapper.MUXER_MODE_DEFAULT, /* dropSamplesBeforeFirstVideoSample= */ fileStartsOnVideoFrameEnabled, - /* appendVideoFormat= */ null), + /* appendVideoFormat= */ null, + maxDelayBetweenMuxerSamplesMs), componentListener, /* initialTimestampOffsetUs= */ 0, /* useDefaultAssetLoaderFactory= */ false); @@ -1256,7 +1289,8 @@ public final class Transformer { componentListener, MuxerWrapper.MUXER_MODE_DEFAULT, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ null), + /* appendVideoFormat= */ null, + maxDelayBetweenMuxerSamplesMs), componentListener, /* initialTimestampOffsetUs= */ 0, /* useDefaultAssetLoaderFactory= */ false); @@ -1289,7 +1323,8 @@ public final class Transformer { componentListener, MuxerWrapper.MUXER_MODE_MUX_PARTIAL, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ resumeMetadata.videoFormat); + /* appendVideoFormat= */ resumeMetadata.videoFormat, + maxDelayBetweenMuxerSamplesMs); startInternal( TransmuxTranscodeHelper.createVideoOnlyComposition( @@ -1340,7 +1375,8 @@ public final class Transformer { componentListener, MuxerWrapper.MUXER_MODE_DEFAULT, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ null); + /* appendVideoFormat= */ null, + maxDelayBetweenMuxerSamplesMs); startInternal( TransmuxTranscodeHelper.createAudioTranscodeAndVideoTransmuxComposition( @@ -1435,7 +1471,8 @@ public final class Transformer { componentListener, MuxerWrapper.MUXER_MODE_MUX_PARTIAL, /* dropSamplesBeforeFirstVideoSample= */ false, - mp4Info.videoFormat); + mp4Info.videoFormat, + maxDelayBetweenMuxerSamplesMs); if (shouldTranscodeVideo( checkNotNull(mp4Info.videoFormat), composition, diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/CapturingMuxer.java b/libraries/transformer/src/test/java/androidx/media3/transformer/CapturingMuxer.java index c44f9c9d3d..32c058caf3 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/CapturingMuxer.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/CapturingMuxer.java @@ -52,11 +52,7 @@ public final class CapturingMuxer implements Muxer, Dumpable { @Nullable private CapturingMuxer muxer; public Factory() { - this(/* maxDelayBetweenSamplesMs= */ C.TIME_UNSET); - } - - public Factory(long maxDelayBetweenSamplesMs) { - this.wrappedFactory = new DefaultMuxer.Factory(maxDelayBetweenSamplesMs); + this.wrappedFactory = new DefaultMuxer.Factory(); } /** Returns the most recently {@linkplain #create created} {@code TestMuxer}. */ @@ -136,11 +132,6 @@ public final class CapturingMuxer implements Muxer, Dumpable { wrappedMuxer.release(forCancellation); } - @Override - public long getMaxDelayBetweenSamplesMs() { - return wrappedMuxer.getMaxDelayBetweenSamplesMs(); - } - // Dumper.Dumpable implementation. @Override diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/EncodedSampleExporterTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/EncodedSampleExporterTest.java index ecff17a11a..a11129ac06 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/EncodedSampleExporterTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/EncodedSampleExporterTest.java @@ -69,7 +69,8 @@ public final class EncodedSampleExporterTest { mock(MuxerWrapper.Listener.class), MuxerWrapper.MUXER_MODE_DEFAULT, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ null), + /* appendVideoFormat= */ null, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS), fallbackListener, /* initialTimestampOffsetUs= */ 0); } diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/MediaItemExportTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/MediaItemExportTest.java index d2662f868e..3886d93e21 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/MediaItemExportTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/MediaItemExportTest.java @@ -19,7 +19,6 @@ package androidx.media3.transformer; import static androidx.media3.test.utils.robolectric.RobolectricUtil.runLooperUntil; import static androidx.media3.transformer.AssetLoader.SUPPORTED_OUTPUT_TYPE_DECODED; import static androidx.media3.transformer.AssetLoader.SUPPORTED_OUTPUT_TYPE_ENCODED; -import static androidx.media3.transformer.DefaultMuxer.Factory.DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS; import static androidx.media3.transformer.ExportResult.CONVERSION_PROCESS_NA; import static androidx.media3.transformer.ExportResult.CONVERSION_PROCESS_TRANSMUXED; import static androidx.media3.transformer.ExportResult.OPTIMIZATION_ABANDONED_KEYFRAME_PLACEMENT_OPTIMAL_FOR_TRIM; @@ -919,10 +918,10 @@ public final class MediaItemExportTest { decoderFactory, new FakeClock(/* isAutoAdvancing= */ true), mediaSourceFactory); - CapturingMuxer.Factory muxerFactory = - new CapturingMuxer.Factory(/* maxDelayBetweenSamplesMs= */ 1); + CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(); Transformer transformer = createTransformerBuilder(muxerFactory, /* enableFallback= */ false) + .setMaxDelayBetweenMuxerSamplesMs(1) .setAssetLoaderFactory(assetLoaderFactory) .build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); @@ -936,10 +935,11 @@ public final class MediaItemExportTest { @Test public void start_withUnsetMaxDelayBetweenSamples_completesSuccessfully() throws Exception { - CapturingMuxer.Factory muxerFactory = - new CapturingMuxer.Factory(/* maxDelayBetweenSamplesMs= */ C.TIME_UNSET); + CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(); Transformer transformer = - createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build(); + createTransformerBuilder(muxerFactory, /* enableFallback= */ false) + .setMaxDelayBetweenMuxerSamplesMs(C.TIME_UNSET) + .build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); transformer.start(mediaItem, outputDir.newFile().getPath()); @@ -1490,8 +1490,7 @@ public final class MediaItemExportTest { // FrameworkMuxer. Transformer transformer = createTransformerBuilder( - new FrameworkMuxer.Factory(DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS, C.TIME_UNSET), - /* enableFallback= */ false) + new FrameworkMuxer.Factory(C.TIME_UNSET), /* enableFallback= */ false) .build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_ELST_SKIP_500MS); diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/MuxerWrapperTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/MuxerWrapperTest.java index 9eec4bc83d..b3ff5afdad 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/MuxerWrapperTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/MuxerWrapperTest.java @@ -91,7 +91,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_DEFAULT, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ null); + /* appendVideoFormat= */ null, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); muxerWrapper.setAdditionalRotationDegrees(90); muxerWrapper.setTrackCount(1); muxerWrapper.setAdditionalRotationDegrees(180); @@ -109,7 +110,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_DEFAULT, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ null); + /* appendVideoFormat= */ null, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); muxerWrapper.setAdditionalRotationDegrees(90); muxerWrapper.setTrackCount(1); muxerWrapper.setAdditionalRotationDegrees(180); @@ -127,7 +129,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_DEFAULT, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ null); + /* appendVideoFormat= */ null, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); assertThrows(IllegalStateException.class, muxerWrapper::changeToAppendMode); } @@ -144,7 +147,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_MUX_PARTIAL, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ null)); + /* appendVideoFormat= */ null, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS)); } @Test @@ -156,7 +160,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_MUX_PARTIAL, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT); + /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); muxerWrapper.setTrackCount(1); muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT); @@ -179,7 +184,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_MUX_PARTIAL, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT); + /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); muxerWrapper.setTrackCount(1); muxerWrapper.addTrackFormat(FAKE_AUDIO_TRACK_FORMAT); muxerWrapper.writeSample( @@ -202,7 +208,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_MUX_PARTIAL, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ differentVideoFormat); + /* appendVideoFormat= */ differentVideoFormat, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); muxerWrapper.setTrackCount(1); muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT); muxerWrapper.writeSample( @@ -237,7 +244,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_MUX_PARTIAL, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ differentVideoFormat); + /* appendVideoFormat= */ differentVideoFormat, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); muxerWrapper.setTrackCount(1); muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT); muxerWrapper.writeSample( @@ -263,7 +271,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_MUX_PARTIAL, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT); + /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); muxerWrapper.setTrackCount(1); muxerWrapper.addTrackFormat(FAKE_AUDIO_TRACK_FORMAT); muxerWrapper.writeSample( @@ -290,7 +299,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_DEFAULT, /* dropSamplesBeforeFirstVideoSample= */ true, - /* appendVideoFormat= */ null); + /* appendVideoFormat= */ null, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); muxerWrapper.setTrackCount(2); muxerWrapper.addTrackFormat(FAKE_AUDIO_TRACK_FORMAT); muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT); @@ -318,7 +328,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_DEFAULT, /* dropSamplesBeforeFirstVideoSample= */ true, - /* appendVideoFormat= */ null); + /* appendVideoFormat= */ null, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); muxerWrapper.setTrackCount(2); muxerWrapper.addTrackFormat(FAKE_AUDIO_TRACK_FORMAT); muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT); @@ -357,7 +368,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_MUX_PARTIAL, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT); + /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); muxerWrapper.setTrackCount(1); muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT); muxerWrapper.writeSample( @@ -378,7 +390,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_MUX_PARTIAL, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT); + /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); muxerWrapper.setTrackCount(2); muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT); @@ -407,7 +420,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_MUX_PARTIAL, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT); + /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); muxerWrapper.setTrackCount(1); muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT); muxerWrapper.writeSample( @@ -564,7 +578,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_MUX_PARTIAL, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT); + /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); muxerWrapper.setTrackCount(1); muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT); muxerWrapper.writeSample( @@ -590,7 +605,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_MUX_PARTIAL, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT); + /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); muxerWrapper.setTrackCount(1); muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT); muxerWrapper.writeSample( @@ -615,7 +631,8 @@ public class MuxerWrapperTest { new NoOpMuxerListenerImpl(), MUXER_MODE_MUX_PARTIAL, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT); + /* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); muxerWrapper.setTrackCount(1); muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT); muxerWrapper.writeSample( diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerUtilTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerUtilTest.java index a944c9034f..824cf98aab 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerUtilTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerUtilTest.java @@ -71,7 +71,8 @@ public final class TransformerUtilTest { new NoOpMuxerListenerImpl(), MUXER_MODE_DEFAULT, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ null); + /* appendVideoFormat= */ null, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); assertThat( shouldTranscodeVideo( @@ -104,7 +105,8 @@ public final class TransformerUtilTest { new NoOpMuxerListenerImpl(), MUXER_MODE_DEFAULT, /* dropSamplesBeforeFirstVideoSample= */ false, - /* appendVideoFormat= */ null); + /* appendVideoFormat= */ null, + Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS); assertThat( shouldTranscodeVideo(