diff --git a/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java index 23b5352ed2..91e3f4ac76 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java @@ -196,7 +196,8 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { // PlayerMessage.Target implementation. @Override - public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { + public void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException { // Do nothing. } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java index 39dd111078..b6f8482ac9 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java @@ -179,7 +179,8 @@ public abstract class NoSampleRenderer implements Renderer, RendererCapabilities // PlayerMessage.Target implementation. @Override - public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { + public void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException { // Do nothing. } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/PlayerMessage.java b/library/core/src/main/java/com/google/android/exoplayer2/PlayerMessage.java index 6ff7100ad1..0d591ee9f6 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/PlayerMessage.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/PlayerMessage.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2; import android.os.Handler; import android.os.Looper; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.Renderer.MessageType; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Clock; import java.util.concurrent.TimeoutException; @@ -39,7 +40,8 @@ public final class PlayerMessage { * @throws ExoPlaybackException If an error occurred whilst handling the message. Should only be * thrown by targets that handle messages on the playback thread. */ - void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException; + void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException; } /** A sender for messages. */ diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java index b56e67ec2b..b7b8f6bb3c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java @@ -74,6 +74,33 @@ public interface Renderer extends PlayerMessage.Target { void onWakeup(); } + /** + * Represents a type of message that can be passed to a renderer. May be one of {@link + * #MSG_SET_VIDEO_OUTPUT}, {@link #MSG_SET_VOLUME}, {@link #MSG_SET_AUDIO_ATTRIBUTES}, {@link + * #MSG_SET_SCALING_MODE}, {@link #MSG_SET_CHANGE_FRAME_RATE_STRATEGY}, {@link + * #MSG_SET_AUX_EFFECT_INFO}, {@link #MSG_SET_VIDEO_FRAME_METADATA_LISTENER}, {@link + * #MSG_SET_CAMERA_MOTION_LISTENER}, {@link #MSG_SET_SKIP_SILENCE_ENABLED}, {@link + * #MSG_SET_AUDIO_SESSION_ID} or {@link #MSG_SET_WAKEUP_LISTENER}. May also be an app-defined + * value (see {@link #MSG_CUSTOM_BASE}). + */ + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef( + open = true, + value = { + MSG_SET_VIDEO_OUTPUT, + MSG_SET_VOLUME, + MSG_SET_AUDIO_ATTRIBUTES, + MSG_SET_SCALING_MODE, + MSG_SET_CHANGE_FRAME_RATE_STRATEGY, + MSG_SET_AUX_EFFECT_INFO, + MSG_SET_VIDEO_FRAME_METADATA_LISTENER, + MSG_SET_CAMERA_MOTION_LISTENER, + MSG_SET_SKIP_SILENCE_ENABLED, + MSG_SET_AUDIO_SESSION_ID, + MSG_SET_WAKEUP_LISTENER + }) + public @interface MessageType {} /** * The type of a message that can be passed to a video renderer via {@link * ExoPlayer#createMessage(Target)}. The message payload is normally a {@link Surface}, however diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 0118dddeaf..849cdc8433 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -45,6 +45,7 @@ import android.view.TextureView; import androidx.annotation.IntRange; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import com.google.android.exoplayer2.Renderer.MessageType; import com.google.android.exoplayer2.analytics.AnalyticsCollector; import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.audio.AudioAttributes; @@ -2206,11 +2207,15 @@ public class SimpleExoPlayer extends BasePlayer private static final class FrameMetadataListener implements VideoFrameMetadataListener, CameraMotionListener, PlayerMessage.Target { + @MessageType public static final int MSG_SET_VIDEO_FRAME_METADATA_LISTENER = Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER; + + @MessageType public static final int MSG_SET_CAMERA_MOTION_LISTENER = Renderer.MSG_SET_CAMERA_MOTION_LISTENER; - public static final int MSG_SET_SPHERICAL_SURFACE_VIEW = Renderer.MSG_CUSTOM_BASE; + + @MessageType public static final int MSG_SET_SPHERICAL_SURFACE_VIEW = Renderer.MSG_CUSTOM_BASE; @Nullable private VideoFrameMetadataListener videoFrameMetadataListener; @Nullable private CameraMotionListener cameraMotionListener; @@ -2218,7 +2223,7 @@ public class SimpleExoPlayer extends BasePlayer @Nullable private CameraMotionListener internalCameraMotionListener; @Override - public void handleMessage(int messageType, @Nullable Object message) { + public void handleMessage(@MessageType int messageType, @Nullable Object message) { switch (messageType) { case MSG_SET_VIDEO_FRAME_METADATA_LISTENER: videoFrameMetadataListener = (VideoFrameMetadataListener) message; @@ -2227,7 +2232,7 @@ public class SimpleExoPlayer extends BasePlayer cameraMotionListener = (CameraMotionListener) message; break; case MSG_SET_SPHERICAL_SURFACE_VIEW: - SphericalGLSurfaceView surfaceView = (SphericalGLSurfaceView) message; + @Nullable SphericalGLSurfaceView surfaceView = (SphericalGLSurfaceView) message; if (surfaceView == null) { internalVideoFrameMetadataListener = null; internalCameraMotionListener = null; @@ -2236,6 +2241,15 @@ public class SimpleExoPlayer extends BasePlayer internalCameraMotionListener = surfaceView.getCameraMotionListener(); } break; + case Renderer.MSG_SET_AUDIO_ATTRIBUTES: + case Renderer.MSG_SET_AUDIO_SESSION_ID: + case Renderer.MSG_SET_AUX_EFFECT_INFO: + case Renderer.MSG_SET_CHANGE_FRAME_RATE_STRATEGY: + case Renderer.MSG_SET_SCALING_MODE: + case Renderer.MSG_SET_SKIP_SILENCE_ENABLED: + case Renderer.MSG_SET_VIDEO_OUTPUT: + case Renderer.MSG_SET_VOLUME: + case Renderer.MSG_SET_WAKEUP_LISTENER: default: break; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java index e5b306aff1..ed97f09d3f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java @@ -571,7 +571,8 @@ public abstract class DecoderAudioRenderer< } @Override - public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { + public void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException { switch (messageType) { case MSG_SET_VOLUME: audioSink.setVolume((Float) message); @@ -590,6 +591,12 @@ public abstract class DecoderAudioRenderer< case MSG_SET_AUDIO_SESSION_ID: audioSink.setAudioSessionId((Integer) message); break; + case MSG_SET_CAMERA_MOTION_LISTENER: + case MSG_SET_CHANGE_FRAME_RATE_STRATEGY: + case MSG_SET_SCALING_MODE: + case MSG_SET_VIDEO_FRAME_METADATA_LISTENER: + case MSG_SET_VIDEO_OUTPUT: + case MSG_SET_WAKEUP_LISTENER: default: super.handleMessage(messageType, message); break; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java index b3de393abb..66a56cf15e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java @@ -15,6 +15,11 @@ */ package com.google.android.exoplayer2.audio; +import static com.google.android.exoplayer2.Renderer.MSG_SET_CAMERA_MOTION_LISTENER; +import static com.google.android.exoplayer2.Renderer.MSG_SET_CHANGE_FRAME_RATE_STRATEGY; +import static com.google.android.exoplayer2.Renderer.MSG_SET_SCALING_MODE; +import static com.google.android.exoplayer2.Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER; +import static com.google.android.exoplayer2.Renderer.MSG_SET_VIDEO_OUTPUT; import static com.google.android.exoplayer2.decoder.DecoderReuseEvaluation.DISCARD_REASON_MAX_INPUT_SIZE_EXCEEDED; import static com.google.android.exoplayer2.decoder.DecoderReuseEvaluation.REUSE_RESULT_NO; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; @@ -667,7 +672,8 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media } @Override - public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { + public void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException { switch (messageType) { case MSG_SET_VOLUME: audioSink.setVolume((Float) message); @@ -689,6 +695,11 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media case MSG_SET_WAKEUP_LISTENER: this.wakeupListener = (WakeupListener) message; break; + case MSG_SET_CAMERA_MOTION_LISTENER: + case MSG_SET_CHANGE_FRAME_RATE_STRATEGY: + case MSG_SET_SCALING_MODE: + case MSG_SET_VIDEO_FRAME_METADATA_LISTENER: + case MSG_SET_VIDEO_OUTPUT: default: super.handleMessage(messageType, message); break; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java index 30630bf878..2c64e6c92f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java @@ -247,7 +247,8 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { // PlayerMessage.Target implementation. @Override - public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { + public void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException { if (messageType == MSG_SET_VIDEO_OUTPUT) { setOutput(message); } else if (messageType == MSG_SET_VIDEO_FRAME_METADATA_LISTENER) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java index 1848950a96..2640eb3c56 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java @@ -505,7 +505,8 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { } @Override - public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { + public void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException { switch (messageType) { case MSG_SET_VIDEO_OUTPUT: setOutput(message); @@ -532,6 +533,12 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { } } break; + case MSG_SET_AUDIO_ATTRIBUTES: + case MSG_SET_AUX_EFFECT_INFO: + case MSG_SET_CAMERA_MOTION_LISTENER: + case MSG_SET_SKIP_SILENCE_ENABLED: + case MSG_SET_VOLUME: + case MSG_SET_WAKEUP_LISTENER: default: super.handleMessage(messageType, message); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/CameraMotionRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/CameraMotionRenderer.java index 6eaa2812c9..8d2c801fab 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/CameraMotionRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/CameraMotionRenderer.java @@ -64,7 +64,8 @@ public final class CameraMotionRenderer extends BaseRenderer { } @Override - public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { + public void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException { if (messageType == MSG_SET_CAMERA_MOTION_LISTENER) { listener = (CameraMotionListener) message; } else { diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 8ec85152fd..deb4e780e1 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -2573,7 +2573,7 @@ public final class ExoPlayerTest { Renderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO) { @Override - public void handleMessage(int messageType, @Nullable Object message) + public void handleMessage(@MessageType int messageType, @Nullable Object message) throws ExoPlaybackException { super.handleMessage(messageType, message); rendererMessages.add(messageType); @@ -11093,7 +11093,7 @@ public final class ExoPlayerTest { } @Override - public void handleMessage(int messageType, @Nullable Object message) + public void handleMessage(@MessageType int messageType, @Nullable Object message) throws ExoPlaybackException { if (messageType == MSG_SET_WAKEUP_LISTENER) { assertThat(message).isNotNull(); @@ -11116,7 +11116,7 @@ public final class ExoPlayerTest { public int messageCount; @Override - public void handleMessage(int messageType, @Nullable Object message) { + public void handleMessage(@Renderer.MessageType int messageType, @Nullable Object message) { messageCount++; } } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ActionSchedule.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ActionSchedule.java index f88938a962..a93d23ab95 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ActionSchedule.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ActionSchedule.java @@ -24,6 +24,7 @@ import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.PlayerMessage; import com.google.android.exoplayer2.PlayerMessage.Target; +import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.audio.AudioAttributes; @@ -616,7 +617,8 @@ public final class ActionSchedule { SimpleExoPlayer player, int messageType, @Nullable Object message); @Override - public final void handleMessage(int messageType, @Nullable Object message) { + public final void handleMessage( + @Renderer.MessageType int messageType, @Nullable Object message) { handleMessage(Assertions.checkStateNotNull(player), messageType, message); if (callback != null) { hasArrived = true; diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeVideoRenderer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeVideoRenderer.java index 10e5ade18e..ad30d53bae 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeVideoRenderer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeVideoRenderer.java @@ -95,12 +95,24 @@ public class FakeVideoRenderer extends FakeRenderer { } @Override - public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { + public void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException { switch (messageType) { case MSG_SET_VIDEO_OUTPUT: output = message; renderedFirstFrameAfterReset = false; break; + + case Renderer.MSG_SET_AUDIO_ATTRIBUTES: + case Renderer.MSG_SET_AUDIO_SESSION_ID: + case Renderer.MSG_SET_AUX_EFFECT_INFO: + case Renderer.MSG_SET_CAMERA_MOTION_LISTENER: + case Renderer.MSG_SET_CHANGE_FRAME_RATE_STRATEGY: + case Renderer.MSG_SET_SCALING_MODE: + case Renderer.MSG_SET_SKIP_SILENCE_ENABLED: + case Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER: + case Renderer.MSG_SET_VOLUME: + case Renderer.MSG_SET_WAKEUP_LISTENER: default: super.handleMessage(messageType, message); }