diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/AssetLoader.java b/libraries/transformer/src/main/java/androidx/media3/transformer/AssetLoader.java index 4bd87ddac7..d1c480da6e 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/AssetLoader.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/AssetLoader.java @@ -119,8 +119,7 @@ public interface AssetLoader { * *
Must be called for each track that will be output. - * - *
Must be called on the same thread as {@link #onTrackAdded(Format, long, long)}. - */ - void onTrackRegistered(); - - /** Called when all the tracks have been {@linkplain #onTrackRegistered() registered}. */ - void onAllTracksRegistered(); + /** Called when the number of tracks output by the asset loader is known. */ + void onTrackCount(int trackCount); /** - * Called when the information on a {@linkplain #onTrackRegistered() registered} track is known. + * Called when the information on a track is known. * - *
Must be called after the duration has been {@linkplain #onDurationUs(long) reported} and - * all the tracks have been {@linkplain #onAllTracksRegistered registered}. + *
Must be called after the {@linkplain #onDurationUs(long) duration} and the {@linkplain + * #onTrackCount(int) track count} have been reported. * - *
Must be called on the same thread as {@link #onTrackRegistered()}. + *
Must be called once per {@linkplain #onTrackCount(int) declared} track. * * @param format The {@link Format} of the input media (prior to video slow motion flattening or * to decoding). 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 925c64c581..957cf9012c 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoader.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoader.java @@ -343,7 +343,14 @@ public final class ExoPlayerAssetLoader implements AssetLoader { @Override public void onTracksChanged(Tracks tracks) { - assetLoaderListener.onAllTracksRegistered(); + int trackCount = 0; + if (tracks.isTypeSelected(C.TRACK_TYPE_AUDIO)) { + trackCount++; + } + if (tracks.isTypeSelected(C.TRACK_TYPE_VIDEO)) { + trackCount++; + } + assetLoaderListener.onTrackCount(trackCount); } @Override diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoaderRenderer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoaderRenderer.java index 3337553174..a77a288666 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoaderRenderer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoaderRenderer.java @@ -129,7 +129,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; @Override protected void onEnabled(boolean joining, boolean mayRenderStartOfStream) { - assetLoaderListener.onTrackRegistered(); mediaClock.updateTimeForTrackType(getTrackType(), 0L); } 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 f292ef0dcf..97ba06bfb2 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java @@ -49,6 +49,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /* package */ final class TransformerInternal { @@ -378,15 +379,16 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private final MediaItem mediaItem; private final FallbackListener fallbackListener; + private final AtomicInteger trackCount; private int tracksAddedCount; private volatile long durationUs; - private volatile boolean trackRegistered; public ComponentListener(MediaItem mediaItem, FallbackListener fallbackListener) { this.mediaItem = mediaItem; this.fallbackListener = fallbackListener; + trackCount = new AtomicInteger(); durationUs = C.TIME_UNSET; } @@ -398,28 +400,27 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } @Override - public void onTrackRegistered() { - trackRegistered = true; - muxerWrapper.registerTrack(); - fallbackListener.registerTrack(); - - if (forceSilentAudio) { - muxerWrapper.registerTrack(); - fallbackListener.registerTrack(); - } - } - - @Override - public void onAllTracksRegistered() { - if (!trackRegistered) { + public void onTrackCount(int trackCount) { + if (trackCount == 0) { onError(new IllegalStateException("The output does not contain any tracks.")); } + this.trackCount.set(trackCount); } @Override public SamplePipeline.Input onTrackAdded( Format format, long streamStartPositionUs, long streamOffsetUs) throws TransformationException { + if (tracksAddedCount == 0) { + if (forceSilentAudio) { + trackCount.incrementAndGet(); + } + for (int i = 0; i < trackCount.get(); i++) { + muxerWrapper.registerTrack(); + fallbackListener.registerTrack(); + } + } + SamplePipeline samplePipeline = getSamplePipeline(format, streamStartPositionUs, streamOffsetUs); internalHandler.obtainMessage(MSG_REGISTER_SAMPLE_PIPELINE, samplePipeline).sendToTarget();