diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoader.java b/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoader.java index d7f29fefde..a1dfa3177b 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoader.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoader.java @@ -49,7 +49,6 @@ import androidx.media3.exoplayer.source.MediaSource; import androidx.media3.exoplayer.text.TextOutput; import androidx.media3.exoplayer.trackselection.DefaultTrackSelector; import androidx.media3.exoplayer.video.VideoRendererEventListener; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /* package */ final class ExoPlayerAssetLoader { @@ -57,6 +56,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; void onTrackRegistered(); + void onAllTracksRegistered(); + SamplePipeline onTrackAdded(Format format, long streamStartPositionUs, long streamOffsetUs) throws TransformationException; @@ -72,7 +73,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private final Looper looper; private final Clock clock; - private @MonotonicNonNull MuxerWrapper muxerWrapper; @Nullable private ExoPlayer player; private @Transformer.ProgressState int progressState; @@ -93,19 +93,14 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } public void start( - MediaItem mediaItem, - MuxerWrapper muxerWrapper, - Listener listener, - Transformer.AsyncErrorListener asyncErrorListener) { - this.muxerWrapper = muxerWrapper; - + MediaItem mediaItem, Listener listener, Transformer.AsyncErrorListener asyncErrorListener) { DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); trackSelector.setParameters( new DefaultTrackSelector.Parameters.Builder(context) .setForceHighestSupportedBitrate(true) .build()); // Arbitrarily decrease buffers for playback so that samples start being sent earlier to the - // muxer (rebuffers are less problematic for the transformation use case). + // pipelines (rebuffers are less problematic for the transformation use case). DefaultLoadControl loadControl = new DefaultLoadControl.Builder() .setBufferDurationsMs( @@ -238,9 +233,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @Override public void onTracksChanged(Tracks tracks) { - if (checkNotNull(muxerWrapper).getTrackCount() == 0) { - listener.onError(new IllegalStateException("The output does not contain any tracks.")); - } + listener.onAllTracksRegistered(); } @Override 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 ea7bc24953..d1f174d9b0 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/MuxerWrapper.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/MuxerWrapper.java @@ -235,11 +235,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } } - /** Returns the number of {@link #registerTrack() registered} tracks. */ - public int getTrackCount() { - return trackCount; - } - /** * Returns the average bitrate of data written to the track of the provided {@code trackType}, or * {@link C#RATE_UNSET_INT} if there is no track data. diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java index 7d47459461..30bd792e12 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java @@ -85,7 +85,7 @@ import com.google.common.collect.ImmutableList; ComponentListener componentListener = new ComponentListener( mediaItem, muxerWrapper, listener, fallbackListener, asyncErrorListener); - exoPlayerAssetLoader.start(mediaItem, muxerWrapper, componentListener, asyncErrorListener); + exoPlayerAssetLoader.start(mediaItem, componentListener, asyncErrorListener); } public @Transformer.ProgressState int getProgress(ProgressHolder progressHolder) { @@ -104,6 +104,8 @@ import com.google.common.collect.ImmutableList; private final FallbackListener fallbackListener; private final Transformer.AsyncErrorListener asyncErrorListener; + private volatile boolean trackRegistered; + public ComponentListener( MediaItem mediaItem, MuxerWrapper muxerWrapper, @@ -119,10 +121,18 @@ import com.google.common.collect.ImmutableList; @Override public void onTrackRegistered() { + trackRegistered = true; muxerWrapper.registerTrack(); fallbackListener.registerTrack(); } + @Override + public void onAllTracksRegistered() { + if (!trackRegistered) { + onError(new IllegalStateException("The output does not contain any tracks.")); + } + } + @Override public SamplePipeline onTrackAdded( Format format, long streamStartPositionUs, long streamOffsetUs)