diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 6ff19fe4f2..b124aea573 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -58,6 +58,7 @@ import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; import com.google.android.exoplayer2.util.Clock; +import com.google.android.exoplayer2.util.Effect; import com.google.android.exoplayer2.util.PriorityTaskManager; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.MediaCodecVideoRenderer; @@ -1456,6 +1457,24 @@ public interface ExoPlayer extends Player { /** Returns whether skipping silences in the audio stream is enabled. */ boolean getSkipSilenceEnabled(); + /** + * Sets a {@link List} of {@linkplain Effect video effects} that will be applied to each video + * frame. + * + *

The following limitations exist for using {@linkplain Effect video effects}: + * + *

+ * + * @param videoEffects The {@link List} of {@linkplain Effect video effects} to apply. + */ + @RequiresApi(18) + void setVideoEffects(List videoEffects); + /** * Sets the {@link C.VideoScalingMode}. * diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 3601f51805..30bb93b482 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -26,6 +26,7 @@ import static com.google.android.exoplayer2.Renderer.MSG_SET_CHANGE_FRAME_RATE_S import static com.google.android.exoplayer2.Renderer.MSG_SET_PREFERRED_AUDIO_DEVICE; import static com.google.android.exoplayer2.Renderer.MSG_SET_SCALING_MODE; import static com.google.android.exoplayer2.Renderer.MSG_SET_SKIP_SILENCE_ENABLED; +import static com.google.android.exoplayer2.Renderer.MSG_SET_VIDEO_EFFECTS; 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.Renderer.MSG_SET_VIDEO_OUTPUT_RESOLUTION; @@ -86,6 +87,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectorResult; import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.ConditionVariable; +import com.google.android.exoplayer2.util.Effect; import com.google.android.exoplayer2.util.HandlerWrapper; import com.google.android.exoplayer2.util.ListenerSet; import com.google.android.exoplayer2.util.Log; @@ -1228,6 +1230,12 @@ import java.util.concurrent.TimeoutException; return playbackInfo.timeline; } + @Override + public void setVideoEffects(List videoEffects) { + verifyApplicationThread(); + sendRendererMessage(TRACK_TYPE_VIDEO, MSG_SET_VIDEO_EFFECTS, videoEffects); + } + @Override public void setVideoScalingMode(@C.VideoScalingMode int videoScalingMode) { verifyApplicationThread(); 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 494d672045..398113bb9b 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 @@ -37,6 +37,7 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import java.util.List; /** * Renders media read from a {@link SampleStream}. @@ -82,8 +83,8 @@ public interface Renderer extends PlayerMessage.Target { * #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}, {@link #MSG_SET_WAKEUP_LISTENER} or {@link - * #MSG_SET_VIDEO_OUTPUT_RESOLUTION}. May also be an app-defined value (see {@link + * #MSG_SET_AUDIO_SESSION_ID}, {@link #MSG_SET_WAKEUP_LISTENER}, {@link #MSG_SET_VIDEO_EFFECTS} or + * {@link #MSG_SET_VIDEO_OUTPUT_RESOLUTION}. May also be an app-defined value (see {@link * #MSG_CUSTOM_BASE}). */ @Documented @@ -103,6 +104,7 @@ public interface Renderer extends PlayerMessage.Target { MSG_SET_SKIP_SILENCE_ENABLED, MSG_SET_AUDIO_SESSION_ID, MSG_SET_WAKEUP_LISTENER, + MSG_SET_VIDEO_EFFECTS, MSG_SET_VIDEO_OUTPUT_RESOLUTION }) public @interface MessageType {} @@ -205,12 +207,17 @@ public interface Renderer extends PlayerMessage.Target { * restore the default. */ int MSG_SET_PREFERRED_AUDIO_DEVICE = 12; + /** + * The type of a message that can be passed to a video renderer. The message payload should be a + * {@link List} containing {@linkplain Effect video effects}. + */ + int MSG_SET_VIDEO_EFFECTS = 13; /** * The type of a message that can be passed to a video renderer to set the desired output * resolution. The message payload should be a {@link Size} of the desired output width and * height. Use this method only when playing with video {@linkplain Effect effects}. */ - int MSG_SET_VIDEO_OUTPUT_RESOLUTION = 13; + int MSG_SET_VIDEO_OUTPUT_RESOLUTION = 14; /** * Applications or extensions may define custom {@code MSG_*} constants that can be passed to * renderers. These custom constants must be greater than or equal to this value. 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 04e703fe95..00449d9a11 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 com.google.android.exoplayer2.trackselection.TrackSelector; import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.ConditionVariable; +import com.google.android.exoplayer2.util.Effect; import com.google.android.exoplayer2.util.PriorityTaskManager; import com.google.android.exoplayer2.util.Size; import com.google.android.exoplayer2.video.VideoFrameMetadataListener; @@ -653,6 +654,12 @@ public class SimpleExoPlayer extends BasePlayer return player.getSkipSilenceEnabled(); } + @Override + public void setVideoEffects(List videoEffects) { + blockUntilConstructorFinished(); + player.setVideoEffects(videoEffects); + } + @Override public void setSkipSilenceEnabled(boolean skipSilenceEnabled) { blockUntilConstructorFinished(); 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 d5f096536e..e147a21d0f 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 @@ -684,6 +684,11 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { } } break; + case MSG_SET_VIDEO_EFFECTS: + @SuppressWarnings("unchecked") + List videoEffects = (List) checkNotNull(message); + frameProcessorManager.setVideoEffects(videoEffects); + break; case MSG_SET_VIDEO_OUTPUT_RESOLUTION: Size outputResolution = (Size) checkNotNull(message); if (outputResolution.getWidth() != 0 diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index 7dc6c8c1bf..a0c4527ea6 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -36,6 +36,7 @@ import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.trackselection.TrackSelector; import com.google.android.exoplayer2.util.Clock; +import com.google.android.exoplayer2.util.Effect; import com.google.android.exoplayer2.util.PriorityTaskManager; import com.google.android.exoplayer2.video.VideoFrameMetadataListener; import com.google.android.exoplayer2.video.spherical.CameraMotionListener; @@ -250,6 +251,11 @@ public class StubExoPlayer extends StubPlayer implements ExoPlayer { throw new UnsupportedOperationException(); } + @Override + public void setVideoEffects(List videoEffects) { + throw new UnsupportedOperationException(); + } + @Override public void setVideoScalingMode(int videoScalingMode) { throw new UnsupportedOperationException();