diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/ImageRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/ImageRenderer.java index 878902be10..b05da06548 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/ImageRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/ImageRenderer.java @@ -200,7 +200,8 @@ public class ImageRenderer extends BaseRenderer { } @Override - protected void onEnabled(boolean joining, boolean mayRenderStartOfStream) { + protected void onEnabled(boolean joining, boolean mayRenderStartOfStream) + throws ExoPlaybackException { firstFrameState = mayRenderStartOfStream ? C.FIRST_FRAME_NOT_RENDERED diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/PlayerTestListener.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/PlayerTestListener.java index 619e7df839..12111f0895 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/PlayerTestListener.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/PlayerTestListener.java @@ -29,6 +29,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** Utility {@link Player.Listener} for testing. */ public final class PlayerTestListener implements Player.Listener, AnalyticsListener { + private final ConditionVariable playerIdle; private final ConditionVariable playerReady; private final ConditionVariable playerEnded; private final ConditionVariable firstFrameRendered; @@ -43,6 +44,7 @@ public final class PlayerTestListener implements Player.Listener, AnalyticsListe * #waitUntilPlayerReady()} and {@link #waitUntilPlayerEnded()} waits. */ public PlayerTestListener(long testTimeoutMs) { + playerIdle = new ConditionVariable(); playerReady = new ConditionVariable(); playerEnded = new ConditionVariable(); firstFrameRendered = new ConditionVariable(); @@ -50,6 +52,11 @@ public final class PlayerTestListener implements Player.Listener, AnalyticsListe this.testTimeoutMs = testTimeoutMs; } + /** Waits until the {@link Player player} is {@linkplain Player#STATE_IDLE idle}. */ + public void waitUntilPlayerIdle() throws PlaybackException, TimeoutException { + waitOrThrow(playerIdle); + } + /** Waits until the {@link Player player} is {@linkplain Player#STATE_READY ready}. */ public void waitUntilPlayerReady() throws TimeoutException, PlaybackException { waitOrThrow(playerReady); @@ -81,7 +88,9 @@ public final class PlayerTestListener implements Player.Listener, AnalyticsListe @Override public void onPlaybackStateChanged(int playbackState) { - if (playbackState == Player.STATE_READY) { + if (playbackState == Player.STATE_IDLE) { + playerIdle.open(); + } else if (playbackState == Player.STATE_READY) { playerReady.open(); } else if (playbackState == Player.STATE_ENDED) { playerEnded.open(); @@ -96,6 +105,7 @@ public final class PlayerTestListener implements Player.Listener, AnalyticsListe @Override public void onPlayerError(PlaybackException error) { playbackException.set(error); + playerIdle.open(); playerReady.open(); playerEnded.open(); firstFrameRendered.open();