diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java index 4de67f4944..890888ca6e 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java @@ -839,7 +839,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer { throws ExoPlaybackException { if (messageType == MSG_SET_WAKEUP_LISTENER) { wakeupListener = checkNotNull((WakeupListener) message); - onWakeupListenerSet(wakeupListener); } else { super.handleMessage(messageType, message); } @@ -1546,17 +1545,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer { // Do nothing. } - /** - * Called when a {@link WakeupListener} is set. - * - *
The default implementation is a no-op. - * - * @param wakeupListener The {@link WakeupListener}. - */ - protected void onWakeupListenerSet(WakeupListener wakeupListener) { - // Do nothing. - } - /** * Called when a new {@link Format} is read from the upstream {@link MediaPeriod}. * diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DefaultVideoSink.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DefaultVideoSink.java index b696c4070c..f5596b42f0 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DefaultVideoSink.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DefaultVideoSink.java @@ -30,7 +30,6 @@ import androidx.media3.common.util.Clock; import androidx.media3.common.util.Size; import androidx.media3.common.util.TimestampIterator; import androidx.media3.exoplayer.ExoPlaybackException; -import androidx.media3.exoplayer.Renderer; import java.util.ArrayDeque; import java.util.List; import java.util.Queue; @@ -46,7 +45,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; *
The {@linkplain #getInputSurface() input} and {@linkplain #setOutputSurfaceInfo(Surface, Size) @@ -224,6 +222,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; videoFrameHandlers.add(videoFrameHandler); long bufferPresentationTimeUs = framePresentationTimeUs - bufferTimestampAdjustmentUs; videoFrameRenderControl.onFrameAvailableForRendering(bufferPresentationTimeUs); + listenerExecutor.execute(() -> listener.onFrameAvailableForRendering()); return true; } @@ -246,16 +245,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } } - /** - * {@inheritDoc} - * - *
This method will always throw an {@link UnsupportedOperationException}.
- */
- @Override
- public void setWakeupListener(Renderer.WakeupListener wakeupListener) {
- throw new UnsupportedOperationException();
- }
-
@Override
public void join(boolean renderNextFrameImmediately) {
videoFrameReleaseControl.join(renderNextFrameImmediately);
diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java
index 860d2a7255..cbcc07ba1d 100644
--- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java
+++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java
@@ -883,6 +883,15 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
// have been set on the renderer before creating the VideoSink.
videoSink.setListener(
new VideoSink.Listener() {
+
+ @Override
+ public void onFrameAvailableForRendering() {
+ @Nullable WakeupListener wakeupListener = getWakeupListener();
+ if (wakeupListener != null) {
+ wakeupListener.onWakeup();
+ }
+ }
+
@Override
public void onFirstFrameRendered() {
if (displaySurface != null) {
@@ -932,10 +941,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
mayRenderStartOfStream
? RELEASE_FIRST_FRAME_IMMEDIATELY
: RELEASE_FIRST_FRAME_WHEN_STARTED;
- @Nullable WakeupListener wakeupListener = getWakeupListener();
- if (wakeupListener != null) {
- videoSink.setWakeupListener(wakeupListener);
- }
experimentalEnableProcessedStreamChangedAtStart();
} else {
videoFrameReleaseControl.setClock(getClock());
@@ -1464,13 +1469,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
eventDispatcher.videoCodecError(codecError);
}
- @Override
- protected void onWakeupListenerSet(WakeupListener wakeupListener) {
- if (videoSink != null) {
- videoSink.setWakeupListener(wakeupListener);
- }
- }
-
@Override
@Nullable
protected DecoderReuseEvaluation onInputFormatChanged(FormatHolder formatHolder)
diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/PlaybackVideoGraphWrapper.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/PlaybackVideoGraphWrapper.java
index d91d9ff674..b4f375b7fc 100644
--- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/PlaybackVideoGraphWrapper.java
+++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/PlaybackVideoGraphWrapper.java
@@ -55,7 +55,6 @@ import androidx.media3.common.util.TimedValueQueue;
import androidx.media3.common.util.TimestampIterator;
import androidx.media3.common.util.UnstableApi;
import androidx.media3.common.util.Util;
-import androidx.media3.exoplayer.Renderer;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableList;
@@ -80,11 +79,15 @@ public final class PlaybackVideoGraphWrapper implements VideoSinkProvider, Video
/** Listener for {@link PlaybackVideoGraphWrapper} events. */
public interface Listener {
- /** Called when the video frame processor renders the first frame. */
- void onFirstFrameRendered();
- /** Called when the video frame processor dropped a frame. */
- void onFrameDropped();
+ /** Called when an output frame is available for rendering. */
+ default void onFrameAvailableForRendering() {}
+
+ /** Called when the first output frame is rendered. */
+ default void onFirstFrameRendered() {}
+
+ /** Called when an output frame is dropped. */
+ default void onFrameDropped() {}
/**
* Called before a frame is rendered for the first time since setting the surface, and each time
@@ -92,14 +95,14 @@ public final class PlaybackVideoGraphWrapper implements VideoSinkProvider, Video
*
* @param videoSize The video size.
*/
- void onVideoSizeChanged(VideoSize videoSize);
+ default void onVideoSizeChanged(VideoSize videoSize) {}
/**
- * Called when the video frame processor encountered an error.
+ * Called when an error occurs.
*
* @param videoFrameProcessingException The error.
*/
- void onError(VideoFrameProcessingException videoFrameProcessingException);
+ default void onError(VideoFrameProcessingException videoFrameProcessingException) {}
}
/** A builder for {@link PlaybackVideoGraphWrapper} instances. */
@@ -288,7 +291,6 @@ public final class PlaybackVideoGraphWrapper implements VideoSinkProvider, Video
@Nullable private Pair