PlayerMessage.Target
BaseRenderer
, CameraMotionRenderer
, DecoderAudioRenderer
, DecoderVideoRenderer
, FakeAudioRenderer
, FakeMediaClockRenderer
, FakeRenderer
, FakeVideoRenderer
, FfmpegAudioRenderer
, LibflacAudioRenderer
, Libgav1VideoRenderer
, LibopusAudioRenderer
, LibvpxVideoRenderer
, MediaCodecAudioRenderer
, MediaCodecRenderer
, MediaCodecVideoRenderer
, MetadataRenderer
, NoSampleRenderer
, TextRenderer
public interface Renderer extends PlayerMessage.Target
SampleStream
.
Internally, a renderer's lifecycle is managed by the owning ExoPlayer
. The renderer is
transitioned through various states as the overall playback state and enabled tracks change. The
valid state transitions are shown below, annotated with the methods that are called during each
transition.
Modifier and Type | Interface | Description |
---|---|---|
static interface |
Renderer.State |
The renderer states.
|
static interface |
Renderer.VideoScalingMode |
Deprecated.
Use
C.VideoScalingMode . |
static interface |
Renderer.WakeupListener |
Some renderers can signal when
render(long, long) should be called. |
Modifier and Type | Field | Description |
---|---|---|
static int |
MSG_CUSTOM_BASE |
Applications or extensions may define custom
MSG_* constants that can be passed to
renderers. |
static int |
MSG_SET_AUDIO_ATTRIBUTES |
A type of a message that can be passed to an audio renderer via
ExoPlayer.createMessage(Target) . |
static int |
MSG_SET_AUDIO_SESSION_ID |
The type of a message that can be passed to audio and video renderers via
ExoPlayer.createMessage(Target) . |
static int |
MSG_SET_AUX_EFFECT_INFO |
A type of a message that can be passed to an audio renderer via
ExoPlayer.createMessage(Target) . |
static int |
MSG_SET_CAMERA_MOTION_LISTENER |
The type of a message that can be passed to a camera motion renderer via
ExoPlayer.createMessage(Target) . |
static int |
MSG_SET_SCALING_MODE |
The type of a message that can be passed to a
MediaCodec -based video renderer via
ExoPlayer.createMessage(Target) . |
static int |
MSG_SET_SKIP_SILENCE_ENABLED |
The type of a message that can be passed to an audio renderer via
ExoPlayer.createMessage(Target) . |
static int |
MSG_SET_SURFACE |
The type of a message that can be passed to a video renderer via
ExoPlayer.createMessage(Target) . |
static int |
MSG_SET_VIDEO_DECODER_OUTPUT_BUFFER_RENDERER |
The type of a message that can be passed to a
DecoderVideoRenderer via ExoPlayer.createMessage(Target) . |
static int |
MSG_SET_VIDEO_FRAME_METADATA_LISTENER |
The type of a message that can be passed to a video renderer via
ExoPlayer.createMessage(Target) . |
static int |
MSG_SET_VOLUME |
A type of a message that can be passed to an audio renderer via
ExoPlayer.createMessage(Target) . |
static int |
MSG_SET_WAKEUP_LISTENER |
The type of a message that can be passed to a
Renderer via ExoPlayer.createMessage(Target) , to inform the renderer that it can schedule waking up another
component. |
static int |
STATE_DISABLED |
The renderer is disabled.
|
static int |
STATE_ENABLED |
The renderer is enabled but not started.
|
static int |
STATE_STARTED |
The renderer is started.
|
static int |
VIDEO_SCALING_MODE_DEFAULT |
Deprecated.
Use
C.VIDEO_SCALING_MODE_DEFAULT . |
static int |
VIDEO_SCALING_MODE_SCALE_TO_FIT |
Deprecated.
|
static int |
VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING |
Deprecated.
|
Modifier and Type | Method | Description |
---|---|---|
void |
disable() |
Disable the renderer, transitioning it to the
STATE_DISABLED state. |
void |
enable(RendererConfiguration configuration,
Format[] formats,
SampleStream stream,
long positionUs,
boolean joining,
boolean mayRenderStartOfStream,
long startPositionUs,
long offsetUs) |
Enables the renderer to consume from the specified
SampleStream . |
RendererCapabilities |
getCapabilities() |
Returns the capabilities of the renderer.
|
MediaClock |
getMediaClock() |
If the renderer advances its own playback position then this method returns a corresponding
MediaClock . |
String |
getName() |
Returns the name of this renderer, for logging and debugging purposes.
|
long |
getReadingPositionUs() |
Returns the renderer time up to which the renderer has read samples from the current
SampleStream , in microseconds, or C.TIME_END_OF_SOURCE if the renderer has read the
current SampleStream to the end. |
int |
getState() |
Returns the current state of the renderer.
|
SampleStream |
getStream() |
Returns the
SampleStream being consumed, or null if the renderer is disabled. |
int |
getTrackType() |
Returns the track type that the renderer handles.
|
boolean |
hasReadStreamToEnd() |
Returns whether the renderer has read the current
SampleStream to the end. |
boolean |
isCurrentStreamFinal() |
Returns whether the current
SampleStream will be the final one supplied before the
renderer is next disabled or reset. |
boolean |
isEnded() |
Whether the renderer is ready for the
ExoPlayer instance to transition to Player.STATE_ENDED . |
boolean |
isReady() |
Whether the renderer is able to immediately render media from the current position.
|
void |
maybeThrowStreamError() |
Throws an error that's preventing the renderer from reading from its
SampleStream . |
void |
render(long positionUs,
long elapsedRealtimeUs) |
Incrementally renders the
SampleStream . |
void |
replaceStream(Format[] formats,
SampleStream stream,
long startPositionUs,
long offsetUs) |
Replaces the
SampleStream from which samples will be consumed. |
void |
reset() |
Forces the renderer to give up any resources (e.g.
|
void |
resetPosition(long positionUs) |
Signals to the renderer that a position discontinuity has occurred.
|
void |
setCurrentStreamFinal() |
Signals to the renderer that the current
SampleStream will be the final one supplied
before it is next disabled or reset. |
void |
setIndex(int index) |
Sets the index of this renderer within the player.
|
default void |
setPlaybackSpeed(float currentPlaybackSpeed,
float targetPlaybackSpeed) |
Indicates the playback speed to this renderer.
|
void |
start() |
Starts the renderer, meaning that calls to
render(long, long) will cause media to be
rendered. |
void |
stop() |
Stops the renderer, transitioning it to the
STATE_ENABLED state. |
handleMessage
static final int MSG_SET_SURFACE
ExoPlayer.createMessage(Target)
. The message payload should be the target Surface
, or
null.static final int MSG_SET_VOLUME
ExoPlayer.createMessage(Target)
. The message payload should be a Float
with 0 being
silence and 1 being unity gain.static final int MSG_SET_AUDIO_ATTRIBUTES
ExoPlayer.createMessage(Target)
. The message payload should be an AudioAttributes
instance that will configure the
underlying audio track. If not set, the default audio attributes will be used. They are
suitable for general media playback.
Setting the audio attributes during playback may introduce a short gap in audio output as the audio track is recreated. A new audio session id will also be generated.
If tunneling is enabled by the track selector, the specified audio attributes will be ignored, but they will take effect if audio is later played without tunneling.
If the device is running a build before platform API version 21, audio attributes cannot be
set directly on the underlying audio track. In this case, the usage will be mapped onto an
equivalent stream type using Util.getStreamTypeForAudioUsage(int)
.
To get audio attributes that are equivalent to a legacy stream type, pass the stream type to
Util.getAudioUsageForStreamType(int)
and use the returned C.AudioUsage
to build
an audio attributes instance.
static final int MSG_SET_SCALING_MODE
MediaCodec
-based video renderer via
ExoPlayer.createMessage(Target)
. The message payload should be one of the integer
scaling modes in C.VideoScalingMode
.
Note that the scaling mode only applies if the Surface
targeted by the renderer is
owned by a SurfaceView
.
static final int MSG_SET_AUX_EFFECT_INFO
ExoPlayer.createMessage(Target)
. The message payload should be an AuxEffectInfo
instance representing an auxiliary audio effect for the underlying audio track.static final int MSG_SET_VIDEO_FRAME_METADATA_LISTENER
ExoPlayer.createMessage(Target)
. The message payload should be a VideoFrameMetadataListener
instance, or null.static final int MSG_SET_CAMERA_MOTION_LISTENER
ExoPlayer.createMessage(Target)
. The message payload should be a CameraMotionListener
instance, or null.static final int MSG_SET_VIDEO_DECODER_OUTPUT_BUFFER_RENDERER
DecoderVideoRenderer
via ExoPlayer.createMessage(Target)
. The message payload should be the target VideoDecoderOutputBufferRenderer
, or null.
This message is intended only for use with extension renderers that expect a VideoDecoderOutputBufferRenderer
. For other use cases, an output surface should be passed via
MSG_SET_SURFACE
instead.
static final int MSG_SET_SKIP_SILENCE_ENABLED
ExoPlayer.createMessage(Target)
. The message payload should be a Boolean
instance
telling whether to enable or disable skipping silences in the audio stream.static final int MSG_SET_AUDIO_SESSION_ID
ExoPlayer.createMessage(Target)
. The message payload should be an Integer
instance
representing the audio session ID that will be attached to the underlying audio track. Video
renderers that support tunneling will use the audio session ID when tunneling is enabled.static final int MSG_SET_WAKEUP_LISTENER
Renderer
via ExoPlayer.createMessage(Target)
, to inform the renderer that it can schedule waking up another
component.
The message payload must be a Renderer.WakeupListener
instance.
static final int MSG_CUSTOM_BASE
MSG_*
constants that can be passed to
renderers. These custom constants must be greater than or equal to this value.@Deprecated static final int VIDEO_SCALING_MODE_SCALE_TO_FIT
@Deprecated static final int VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING
@Deprecated static final int VIDEO_SCALING_MODE_DEFAULT
C.VIDEO_SCALING_MODE_DEFAULT
.static final int STATE_DISABLED
reset()
can be called to force the renderer to release such resources.static final int STATE_ENABLED
static final int STATE_STARTED
render(long, long)
will cause media to be rendered.String getName()
int getTrackType()
TRACK_TYPE_*
constants defined in C
.Player.getRendererType(int)
RendererCapabilities getCapabilities()
void setIndex(int index)
index
- The renderer index.@Nullable MediaClock getMediaClock()
MediaClock
. If provided, the player will use the returned MediaClock
as its
source of time during playback. A player may have at most one renderer that returns a MediaClock
from this method.MediaClock
tracking the playback position of the renderer, or null.@State int getState()
STATE_DISABLED
, STATE_ENABLED
and STATE_STARTED
.void enable(RendererConfiguration configuration, Format[] formats, SampleStream stream, long positionUs, boolean joining, boolean mayRenderStartOfStream, long startPositionUs, long offsetUs) throws ExoPlaybackException
SampleStream
.
This method may be called when the renderer is in the following states: STATE_DISABLED
.
configuration
- The renderer configuration.formats
- The enabled formats.stream
- The SampleStream
from which the renderer should consume.positionUs
- The player's current position.joining
- Whether this renderer is being enabled to join an ongoing playback.mayRenderStartOfStream
- Whether this renderer is allowed to render the start of the
stream even if the state is not STATE_STARTED
yet.startPositionUs
- The start position of the stream in renderer time (microseconds).offsetUs
- The offset to be added to timestamps of buffers read from stream
before
they are rendered.ExoPlaybackException
- If an error occurs.void start() throws ExoPlaybackException
render(long, long)
will cause media to be
rendered.
This method may be called when the renderer is in the following states:
STATE_ENABLED
.
ExoPlaybackException
- If an error occurs.void replaceStream(Format[] formats, SampleStream stream, long startPositionUs, long offsetUs) throws ExoPlaybackException
SampleStream
from which samples will be consumed.
This method may be called when the renderer is in the following states: STATE_ENABLED
, STATE_STARTED
.
formats
- The enabled formats.stream
- The SampleStream
from which the renderer should consume.startPositionUs
- The start position of the new stream in renderer time (microseconds).offsetUs
- The offset to be added to timestamps of buffers read from stream
before
they are rendered.ExoPlaybackException
- If an error occurs.@Nullable SampleStream getStream()
SampleStream
being consumed, or null if the renderer is disabled.boolean hasReadStreamToEnd()
SampleStream
to the end.
This method may be called when the renderer is in the following states:
STATE_ENABLED
, STATE_STARTED
.
long getReadingPositionUs()
SampleStream
, in microseconds, or C.TIME_END_OF_SOURCE
if the renderer has read the
current SampleStream
to the end.
This method may be called when the renderer is in the following states: STATE_ENABLED
, STATE_STARTED
.
void setCurrentStreamFinal()
SampleStream
will be the final one supplied
before it is next disabled or reset.
This method may be called when the renderer is in the following states:
STATE_ENABLED
, STATE_STARTED
.
boolean isCurrentStreamFinal()
SampleStream
will be the final one supplied before the
renderer is next disabled or reset.void maybeThrowStreamError() throws IOException
SampleStream
. Does
nothing if no such error exists.
This method may be called when the renderer is in the following states:
STATE_ENABLED
, STATE_STARTED
.
IOException
- An error that's preventing the renderer from making progress or buffering
more data.void resetPosition(long positionUs) throws ExoPlaybackException
After a position discontinuity, the renderer's SampleStream
is guaranteed to provide
samples starting from a key frame.
This method may be called when the renderer is in the following states:
STATE_ENABLED
, STATE_STARTED
.
positionUs
- The new playback position in microseconds.ExoPlaybackException
- If an error occurs handling the reset.default void setPlaybackSpeed(float currentPlaybackSpeed, float targetPlaybackSpeed) throws ExoPlaybackException
The default implementation is a no-op.
currentPlaybackSpeed
- The factor by which playback is currently sped up.targetPlaybackSpeed
- The target factor by which playback should be sped up. This may be
different from currentPlaybackSpeed
, for example, if the speed is temporarily
adjusted for live playback.ExoPlaybackException
- If an error occurs handling the playback speed.void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException
SampleStream
.
If the renderer is in the STATE_ENABLED
state then each call to this method will do
work toward being ready to render the SampleStream
when the renderer is started. If the
renderer is in the STATE_STARTED
state then calls to this method will render the
SampleStream
in sync with the specified media positions.
The renderer may also render the very start of the media at the current position (e.g. the
first frame of a video stream) while still in the STATE_ENABLED
state, unless it's the
initial start of the media after calling enable(RendererConfiguration, Format[],
SampleStream, long, boolean, boolean, long, long)
with mayRenderStartOfStream
set to
false
.
This method should return quickly, and should not block if the renderer is unable to make useful progress.
This method may be called when the renderer is in the following states: STATE_ENABLED
, STATE_STARTED
.
positionUs
- The current media time in microseconds, measured at the start of the current
iteration of the rendering loop.elapsedRealtimeUs
- SystemClock.elapsedRealtime()
in microseconds,
measured at the start of the current iteration of the rendering loop.ExoPlaybackException
- If an error occurs.boolean isReady()
If the renderer is in the STATE_STARTED
state then returning true indicates that the
renderer has everything that it needs to continue playback. Returning false indicates that
the player should pause until the renderer is ready.
If the renderer is in the STATE_ENABLED
state then returning true indicates that the
renderer is ready for playback to be started. Returning false indicates that it is not.
This method may be called when the renderer is in the following states:
STATE_ENABLED
, STATE_STARTED
.
boolean isEnded()
ExoPlayer
instance to transition to Player.STATE_ENDED
. The player will make this transition as soon as true
is returned
by all of its renderers.
This method may be called when the renderer is in the following states: STATE_ENABLED
, STATE_STARTED
.
void stop()
STATE_ENABLED
state.
This method may be called when the renderer is in the following states: STATE_STARTED
.
void disable()
STATE_DISABLED
state.
This method may be called when the renderer is in the following states:
STATE_ENABLED
.
void reset()
This method may be called when the renderer is in the following states: STATE_DISABLED
.