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(