mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Add public API and render messages for setting effects.
PiperOrigin-RevId: 509165378
This commit is contained in:
parent
31d04748ef
commit
519209feac
7 changed files with 59 additions and 3 deletions
|
|
@ -26,6 +26,9 @@
|
||||||
* Add `ConcatenatingMediaSource2` that allows combining multiple media
|
* Add `ConcatenatingMediaSource2` that allows combining multiple media
|
||||||
items into a single window
|
items into a single window
|
||||||
([#247](https://github.com/androidx/media/issues/247)).
|
([#247](https://github.com/androidx/media/issues/247)).
|
||||||
|
* Add `ExoPlayer.setVideoEffects()` for using `Effect` during video
|
||||||
|
playback.
|
||||||
|
* Extractors:
|
||||||
* Update `SampleQueue` to store `sourceId` as a `long` rather than an
|
* Update `SampleQueue` to store `sourceId` as a `long` rather than an
|
||||||
`int`. This changes the signatures of public methods
|
`int`. This changes the signatures of public methods
|
||||||
`SampleQueue.sourceId` and `SampleQueue.peekSourceId`.
|
`SampleQueue.sourceId` and `SampleQueue.peekSourceId`.
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ import androidx.media3.common.AudioAttributes;
|
||||||
import androidx.media3.common.AuxEffectInfo;
|
import androidx.media3.common.AuxEffectInfo;
|
||||||
import androidx.media3.common.C;
|
import androidx.media3.common.C;
|
||||||
import androidx.media3.common.DeviceInfo;
|
import androidx.media3.common.DeviceInfo;
|
||||||
|
import androidx.media3.common.Effect;
|
||||||
import androidx.media3.common.Format;
|
import androidx.media3.common.Format;
|
||||||
import androidx.media3.common.MediaItem;
|
import androidx.media3.common.MediaItem;
|
||||||
import androidx.media3.common.Player;
|
import androidx.media3.common.Player;
|
||||||
|
|
@ -1530,6 +1531,25 @@ public interface ExoPlayer extends Player {
|
||||||
@UnstableApi
|
@UnstableApi
|
||||||
boolean getSkipSilenceEnabled();
|
boolean getSkipSilenceEnabled();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a {@link List} of {@linkplain Effect video effects} that will be applied to each video
|
||||||
|
* frame.
|
||||||
|
*
|
||||||
|
* <p>The following limitations exist for using {@linkplain Effect video effects}:
|
||||||
|
*
|
||||||
|
* <ul>
|
||||||
|
* <li>This feature works only with the default {@link MediaCodecVideoRenderer} and not custom
|
||||||
|
* or extension {@linkplain Renderer video renderers}.
|
||||||
|
* <li>This feature does not work with DRM-protected contents.
|
||||||
|
* <li>This method should be called before calling {@link #prepare}.
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* @param videoEffects The {@link List} of {@linkplain Effect video effects} to apply.
|
||||||
|
*/
|
||||||
|
@RequiresApi(18)
|
||||||
|
@UnstableApi
|
||||||
|
void setVideoEffects(List<Effect> videoEffects);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the {@link C.VideoScalingMode}.
|
* Sets the {@link C.VideoScalingMode}.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ import static androidx.media3.exoplayer.Renderer.MSG_SET_CHANGE_FRAME_RATE_STRAT
|
||||||
import static androidx.media3.exoplayer.Renderer.MSG_SET_PREFERRED_AUDIO_DEVICE;
|
import static androidx.media3.exoplayer.Renderer.MSG_SET_PREFERRED_AUDIO_DEVICE;
|
||||||
import static androidx.media3.exoplayer.Renderer.MSG_SET_SCALING_MODE;
|
import static androidx.media3.exoplayer.Renderer.MSG_SET_SCALING_MODE;
|
||||||
import static androidx.media3.exoplayer.Renderer.MSG_SET_SKIP_SILENCE_ENABLED;
|
import static androidx.media3.exoplayer.Renderer.MSG_SET_SKIP_SILENCE_ENABLED;
|
||||||
|
import static androidx.media3.exoplayer.Renderer.MSG_SET_VIDEO_EFFECTS;
|
||||||
import static androidx.media3.exoplayer.Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER;
|
import static androidx.media3.exoplayer.Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER;
|
||||||
import static androidx.media3.exoplayer.Renderer.MSG_SET_VIDEO_OUTPUT;
|
import static androidx.media3.exoplayer.Renderer.MSG_SET_VIDEO_OUTPUT;
|
||||||
import static androidx.media3.exoplayer.Renderer.MSG_SET_VIDEO_OUTPUT_RESOLUTION;
|
import static androidx.media3.exoplayer.Renderer.MSG_SET_VIDEO_OUTPUT_RESOLUTION;
|
||||||
|
|
@ -61,6 +62,7 @@ import androidx.media3.common.AuxEffectInfo;
|
||||||
import androidx.media3.common.BasePlayer;
|
import androidx.media3.common.BasePlayer;
|
||||||
import androidx.media3.common.C;
|
import androidx.media3.common.C;
|
||||||
import androidx.media3.common.DeviceInfo;
|
import androidx.media3.common.DeviceInfo;
|
||||||
|
import androidx.media3.common.Effect;
|
||||||
import androidx.media3.common.Format;
|
import androidx.media3.common.Format;
|
||||||
import androidx.media3.common.IllegalSeekPositionException;
|
import androidx.media3.common.IllegalSeekPositionException;
|
||||||
import androidx.media3.common.MediaItem;
|
import androidx.media3.common.MediaItem;
|
||||||
|
|
@ -1239,6 +1241,12 @@ import java.util.concurrent.TimeoutException;
|
||||||
return playbackInfo.timeline;
|
return playbackInfo.timeline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setVideoEffects(List<Effect> videoEffects) {
|
||||||
|
verifyApplicationThread();
|
||||||
|
sendRendererMessage(TRACK_TYPE_VIDEO, MSG_SET_VIDEO_EFFECTS, videoEffects);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setVideoScalingMode(@C.VideoScalingMode int videoScalingMode) {
|
public void setVideoScalingMode(@C.VideoScalingMode int videoScalingMode) {
|
||||||
verifyApplicationThread();
|
verifyApplicationThread();
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,7 @@ import java.lang.annotation.Documented;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
import java.lang.annotation.Target;
|
import java.lang.annotation.Target;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Renders media read from a {@link SampleStream}.
|
* Renders media read from a {@link SampleStream}.
|
||||||
|
|
@ -86,8 +87,8 @@ public interface Renderer extends PlayerMessage.Target {
|
||||||
* #MSG_SET_SCALING_MODE}, {@link #MSG_SET_CHANGE_FRAME_RATE_STRATEGY}, {@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_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_CAMERA_MOTION_LISTENER}, {@link #MSG_SET_SKIP_SILENCE_ENABLED}, {@link
|
||||||
* #MSG_SET_AUDIO_SESSION_ID}, {@link #MSG_SET_WAKEUP_LISTENER} or {@link
|
* #MSG_SET_AUDIO_SESSION_ID}, {@link #MSG_SET_WAKEUP_LISTENER}, {@link #MSG_SET_VIDEO_EFFECTS} or
|
||||||
* #MSG_SET_VIDEO_OUTPUT_RESOLUTION}. May also be an app-defined value (see {@link
|
* {@link #MSG_SET_VIDEO_OUTPUT_RESOLUTION}. May also be an app-defined value (see {@link
|
||||||
* #MSG_CUSTOM_BASE}).
|
* #MSG_CUSTOM_BASE}).
|
||||||
*/
|
*/
|
||||||
@Documented
|
@Documented
|
||||||
|
|
@ -107,6 +108,7 @@ public interface Renderer extends PlayerMessage.Target {
|
||||||
MSG_SET_SKIP_SILENCE_ENABLED,
|
MSG_SET_SKIP_SILENCE_ENABLED,
|
||||||
MSG_SET_AUDIO_SESSION_ID,
|
MSG_SET_AUDIO_SESSION_ID,
|
||||||
MSG_SET_WAKEUP_LISTENER,
|
MSG_SET_WAKEUP_LISTENER,
|
||||||
|
MSG_SET_VIDEO_EFFECTS,
|
||||||
MSG_SET_VIDEO_OUTPUT_RESOLUTION
|
MSG_SET_VIDEO_OUTPUT_RESOLUTION
|
||||||
})
|
})
|
||||||
public @interface MessageType {}
|
public @interface MessageType {}
|
||||||
|
|
@ -209,12 +211,17 @@ public interface Renderer extends PlayerMessage.Target {
|
||||||
* restore the default.
|
* restore the default.
|
||||||
*/
|
*/
|
||||||
int MSG_SET_PREFERRED_AUDIO_DEVICE = 12;
|
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
|
* 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
|
* 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}.
|
* 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
|
* 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.
|
* renderers. These custom constants must be greater than or equal to this value.
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ import androidx.media3.common.AuxEffectInfo;
|
||||||
import androidx.media3.common.BasePlayer;
|
import androidx.media3.common.BasePlayer;
|
||||||
import androidx.media3.common.C;
|
import androidx.media3.common.C;
|
||||||
import androidx.media3.common.DeviceInfo;
|
import androidx.media3.common.DeviceInfo;
|
||||||
|
import androidx.media3.common.Effect;
|
||||||
import androidx.media3.common.Format;
|
import androidx.media3.common.Format;
|
||||||
import androidx.media3.common.MediaItem;
|
import androidx.media3.common.MediaItem;
|
||||||
import androidx.media3.common.MediaMetadata;
|
import androidx.media3.common.MediaMetadata;
|
||||||
|
|
@ -664,6 +665,12 @@ public class SimpleExoPlayer extends BasePlayer
|
||||||
return player.getSkipSilenceEnabled();
|
return player.getSkipSilenceEnabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setVideoEffects(List<Effect> videoEffects) {
|
||||||
|
blockUntilConstructorFinished();
|
||||||
|
player.setVideoEffects(videoEffects);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setSkipSilenceEnabled(boolean skipSilenceEnabled) {
|
public void setSkipSilenceEnabled(boolean skipSilenceEnabled) {
|
||||||
blockUntilConstructorFinished();
|
blockUntilConstructorFinished();
|
||||||
|
|
|
||||||
|
|
@ -688,6 +688,11 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case MSG_SET_VIDEO_EFFECTS:
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
List<Effect> videoEffects = (List<Effect>) checkNotNull(message);
|
||||||
|
frameProcessorManager.setVideoEffects(videoEffects);
|
||||||
|
break;
|
||||||
case MSG_SET_VIDEO_OUTPUT_RESOLUTION:
|
case MSG_SET_VIDEO_OUTPUT_RESOLUTION:
|
||||||
Size outputResolution = (Size) checkNotNull(message);
|
Size outputResolution = (Size) checkNotNull(message);
|
||||||
if (outputResolution.getWidth() != 0
|
if (outputResolution.getWidth() != 0
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ import android.os.Looper;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.media3.common.AudioAttributes;
|
import androidx.media3.common.AudioAttributes;
|
||||||
import androidx.media3.common.AuxEffectInfo;
|
import androidx.media3.common.AuxEffectInfo;
|
||||||
|
import androidx.media3.common.Effect;
|
||||||
import androidx.media3.common.Format;
|
import androidx.media3.common.Format;
|
||||||
import androidx.media3.common.Player;
|
import androidx.media3.common.Player;
|
||||||
import androidx.media3.common.PriorityTaskManager;
|
import androidx.media3.common.PriorityTaskManager;
|
||||||
|
|
@ -252,6 +253,11 @@ public class StubExoPlayer extends StubPlayer implements ExoPlayer {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setVideoEffects(List<Effect> videoEffects) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setVideoScalingMode(int videoScalingMode) {
|
public void setVideoScalingMode(int videoScalingMode) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue