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 d1c480da6e..10cfae3d86 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/AssetLoader.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/AssetLoader.java @@ -18,6 +18,7 @@ package androidx.media3.transformer; import android.content.Context; import android.os.Looper; +import androidx.annotation.IntRange; import androidx.media3.common.Format; import androidx.media3.common.MediaItem; import androidx.media3.common.util.Clock; @@ -131,7 +132,7 @@ public interface AssetLoader { void onDurationUs(long durationUs); /** Called when the number of tracks output by the asset loader is known. */ - void onTrackCount(int trackCount); + void onTrackCount(@IntRange(from = 1) int trackCount); /** * Called when the information on a track is known. 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 957cf9012c..d48fe8ad0c 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoader.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoader.java @@ -16,6 +16,7 @@ package androidx.media3.transformer; +import static androidx.media3.common.PlaybackException.ERROR_CODE_FAILED_RUNTIME_CHECK; 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; @@ -350,7 +351,15 @@ public final class ExoPlayerAssetLoader implements AssetLoader { if (tracks.isTypeSelected(C.TRACK_TYPE_VIDEO)) { trackCount++; } - assetLoaderListener.onTrackCount(trackCount); + if (trackCount == 0) { + assetLoaderListener.onError( + new PlaybackException( + "The asset loader has no track to output.", + /* cause= */ null, + ERROR_CODE_FAILED_RUNTIME_CHECK)); + } else { + assetLoaderListener.onTrackCount(trackCount); + } } @Override 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 7b6b092752..9757dd04d6 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java @@ -401,8 +401,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @Override public void onTrackCount(int trackCount) { - if (trackCount == 0) { - onError(new IllegalStateException("The output does not contain any tracks.")); + if (trackCount <= 0) { + onError(new IllegalStateException("AssetLoader instances must provide at least 1 track.")); + return; } this.trackCount.set(trackCount); if (forceSilentAudio) {