Interface Renderer
-
- All Superinterfaces:
PlayerMessage.Target
- All Known Implementing Classes:
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
Renders media read from aSampleStream
.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.
-
-
Nested Class Summary
Nested Classes Modifier and Type Interface Description static interface
Renderer.MessageType
Represents a type of message that can be passed to a renderer.static interface
Renderer.State
The renderer states.static interface
Renderer.WakeupListener
Some renderers can signal whenrender(long, long)
should be called.
-
Field Summary
Fields Modifier and Type Field Description static int
MSG_CUSTOM_BASE
Applications or extensions may define customMSG_*
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 viaExoPlayer.createMessage(Target)
.static int
MSG_SET_AUDIO_SESSION_ID
The type of a message that can be passed to audio and video renderers viaExoPlayer.createMessage(Target)
.static int
MSG_SET_AUX_EFFECT_INFO
A type of a message that can be passed to an audio renderer viaExoPlayer.createMessage(Target)
.static int
MSG_SET_CAMERA_MOTION_LISTENER
The type of a message that can be passed to a camera motion renderer viaExoPlayer.createMessage(Target)
.static int
MSG_SET_CHANGE_FRAME_RATE_STRATEGY
The type of a message that can be passed to a video renderer viaExoPlayer.createMessage(Target)
.static int
MSG_SET_SCALING_MODE
The type of a message that can be passed to aMediaCodec
-based video renderer viaExoPlayer.createMessage(Target)
.static int
MSG_SET_SKIP_SILENCE_ENABLED
The type of a message that can be passed to an audio renderer viaExoPlayer.createMessage(Target)
.static int
MSG_SET_VIDEO_FRAME_METADATA_LISTENER
The type of a message that can be passed to a video renderer viaExoPlayer.createMessage(Target)
.static int
MSG_SET_VIDEO_OUTPUT
The type of a message that can be passed to a video renderer viaExoPlayer.createMessage(Target)
.static int
MSG_SET_VOLUME
A type of a message that can be passed to an audio renderer viaExoPlayer.createMessage(Target)
.static int
MSG_SET_WAKEUP_LISTENER
The type of a message that can be passed to aRenderer
viaExoPlayer.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.
-
Method Summary
All Methods Instance Methods Abstract Methods Default Methods Modifier and Type Method Description void
disable()
Disable the renderer, transitioning it to theSTATE_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 specifiedSampleStream
.RendererCapabilities
getCapabilities()
Returns the capabilities of the renderer.MediaClock
getMediaClock()
If the renderer advances its own playback position then this method returns a correspondingMediaClock
.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, in microseconds, orC.TIME_END_OF_SOURCE
if the renderer has read the currentSampleStream
to the end.int
getState()
Returns the current state of the renderer.SampleStream
getStream()
Returns theSampleStream
being consumed, or null if the renderer is disabled.@com.google.android.exoplayer2.C.TrackType int
getTrackType()
Returns the track type that the renderer handles.boolean
hasReadStreamToEnd()
Returns whether the renderer has read the currentSampleStream
to the end.boolean
isCurrentStreamFinal()
Returns whether the currentSampleStream
will be the final one supplied before the renderer is next disabled or reset.boolean
isEnded()
Whether the renderer is ready for theExoPlayer
instance to transition toPlayer.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 itsSampleStream
.void
render(long positionUs, long elapsedRealtimeUs)
Incrementally renders theSampleStream
.void
replaceStream(Format[] formats, SampleStream stream, long startPositionUs, long offsetUs)
Replaces theSampleStream
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 currentSampleStream
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 torender(long, long)
will cause media to be rendered.void
stop()
Stops the renderer, transitioning it to theSTATE_ENABLED
state.-
Methods inherited from interface com.google.android.exoplayer2.PlayerMessage.Target
handleMessage
-
-
-
-
Field Detail
-
MSG_SET_VIDEO_OUTPUT
static final int MSG_SET_VIDEO_OUTPUT
The type of a message that can be passed to a video renderer viaExoPlayer.createMessage(Target)
. The message payload is normally aSurface
, however some video renderers may accept other outputs (e.g.,VideoDecoderOutputBufferRenderer
).If the receiving renderer does not support the payload type as an output, then it will clear any existing output that it has.
- See Also:
- Constant Field Values
-
MSG_SET_VOLUME
static final int MSG_SET_VOLUME
A type of a message that can be passed to an audio renderer viaExoPlayer.createMessage(Target)
. The message payload should be aFloat
with 0 being silence and 1 being unity gain.- See Also:
- Constant Field Values
-
MSG_SET_AUDIO_ATTRIBUTES
static final int MSG_SET_AUDIO_ATTRIBUTES
A type of a message that can be passed to an audio renderer viaExoPlayer.createMessage(Target)
. The message payload should be anAudioAttributes
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 returnedC.AudioUsage
to build an audio attributes instance.- See Also:
- Constant Field Values
-
MSG_SET_SCALING_MODE
static final int MSG_SET_SCALING_MODE
The type of a message that can be passed to aMediaCodec
-based video renderer viaExoPlayer.createMessage(Target)
. The message payload should be one of the integer scaling modes inC.VideoScalingMode
.Note that the scaling mode only applies if the
Surface
targeted by the renderer is owned by aSurfaceView
.- See Also:
- Constant Field Values
-
MSG_SET_CHANGE_FRAME_RATE_STRATEGY
static final int MSG_SET_CHANGE_FRAME_RATE_STRATEGY
The type of a message that can be passed to a video renderer viaExoPlayer.createMessage(Target)
. The message payload should be one of the integer strategy constants inC.VideoChangeFrameRateStrategy
.- See Also:
- Constant Field Values
-
MSG_SET_AUX_EFFECT_INFO
static final int MSG_SET_AUX_EFFECT_INFO
A type of a message that can be passed to an audio renderer viaExoPlayer.createMessage(Target)
. The message payload should be anAuxEffectInfo
instance representing an auxiliary audio effect for the underlying audio track.- See Also:
- Constant Field Values
-
MSG_SET_VIDEO_FRAME_METADATA_LISTENER
static final int MSG_SET_VIDEO_FRAME_METADATA_LISTENER
The type of a message that can be passed to a video renderer viaExoPlayer.createMessage(Target)
. The message payload should be aVideoFrameMetadataListener
instance, or null.- See Also:
- Constant Field Values
-
MSG_SET_CAMERA_MOTION_LISTENER
static final int MSG_SET_CAMERA_MOTION_LISTENER
The type of a message that can be passed to a camera motion renderer viaExoPlayer.createMessage(Target)
. The message payload should be aCameraMotionListener
instance, or null.- See Also:
- Constant Field Values
-
MSG_SET_SKIP_SILENCE_ENABLED
static final int MSG_SET_SKIP_SILENCE_ENABLED
The type of a message that can be passed to an audio renderer viaExoPlayer.createMessage(Target)
. The message payload should be aBoolean
instance telling whether to enable or disable skipping silences in the audio stream.- See Also:
- Constant Field Values
-
MSG_SET_AUDIO_SESSION_ID
static final int MSG_SET_AUDIO_SESSION_ID
The type of a message that can be passed to audio and video renderers viaExoPlayer.createMessage(Target)
. The message payload should be anInteger
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.- See Also:
- Constant Field Values
-
MSG_SET_WAKEUP_LISTENER
static final int MSG_SET_WAKEUP_LISTENER
The type of a message that can be passed to aRenderer
viaExoPlayer.createMessage(Target)
, to inform the renderer that it can schedule waking up another component.The message payload must be a
Renderer.WakeupListener
instance.- See Also:
- Constant Field Values
-
MSG_CUSTOM_BASE
static final int MSG_CUSTOM_BASE
Applications or extensions may define customMSG_*
constants that can be passed to renderers. These custom constants must be greater than or equal to this value.- See Also:
- Constant Field Values
-
STATE_DISABLED
static final int STATE_DISABLED
The renderer is disabled. A renderer in this state will not proactively acquire resources that it requires for rendering (e.g., media decoders), but may continue to hold any that it already has.reset()
can be called to force the renderer to release such resources.- See Also:
- Constant Field Values
-
STATE_ENABLED
static final int STATE_ENABLED
The renderer is enabled but not started. A renderer in this state may render media at the current position (e.g. an initial video frame), but the position will not advance. A renderer in this state will typically hold resources that it requires for rendering (e.g. media decoders).- See Also:
- Constant Field Values
-
STATE_STARTED
static final int STATE_STARTED
The renderer is started. Calls torender(long, long)
will cause media to be rendered.- See Also:
- Constant Field Values
-
-
Method Detail
-
getName
String getName()
Returns the name of this renderer, for logging and debugging purposes. Should typically be the renderer's (un-obfuscated) class name.- Returns:
- The name of this renderer.
-
getTrackType
@com.google.android.exoplayer2.C.TrackType int getTrackType()
Returns the track type that the renderer handles.- Returns:
- The
track type
. - See Also:
ExoPlayer.getRendererType(int)
-
getCapabilities
RendererCapabilities getCapabilities()
Returns the capabilities of the renderer.- Returns:
- The capabilities of the renderer.
-
setIndex
void setIndex(int index)
Sets the index of this renderer within the player.- Parameters:
index
- The renderer index.
-
getMediaClock
@Nullable MediaClock getMediaClock()
If the renderer advances its own playback position then this method returns a correspondingMediaClock
. If provided, the player will use the returnedMediaClock
as its source of time during playback. A player may have at most one renderer that returns aMediaClock
from this method.- Returns:
- The
MediaClock
tracking the playback position of the renderer, or null.
-
getState
@State int getState()
Returns the current state of the renderer.- Returns:
- The current state. One of
STATE_DISABLED
,STATE_ENABLED
andSTATE_STARTED
.
-
enable
void enable(RendererConfiguration configuration, Format[] formats, SampleStream stream, long positionUs, boolean joining, boolean mayRenderStartOfStream, long startPositionUs, long offsetUs) throws ExoPlaybackException
Enables the renderer to consume from the specifiedSampleStream
.This method may be called when the renderer is in the following states:
STATE_DISABLED
.- Parameters:
configuration
- The renderer configuration.formats
- The enabled formats.stream
- TheSampleStream
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 notSTATE_STARTED
yet.startPositionUs
- The start position of the stream in renderer time (microseconds).offsetUs
- The offset to be added to timestamps of buffers read fromstream
before they are rendered.- Throws:
ExoPlaybackException
- If an error occurs.
-
start
void start() throws ExoPlaybackException
Starts the renderer, meaning that calls torender(long, long)
will cause media to be rendered.This method may be called when the renderer is in the following states:
STATE_ENABLED
.- Throws:
ExoPlaybackException
- If an error occurs.
-
replaceStream
void replaceStream(Format[] formats, SampleStream stream, long startPositionUs, long offsetUs) throws ExoPlaybackException
Replaces theSampleStream
from which samples will be consumed.This method may be called when the renderer is in the following states:
STATE_ENABLED
,STATE_STARTED
.- Parameters:
formats
- The enabled formats.stream
- TheSampleStream
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 fromstream
before they are rendered.- Throws:
ExoPlaybackException
- If an error occurs.
-
getStream
@Nullable SampleStream getStream()
Returns theSampleStream
being consumed, or null if the renderer is disabled.
-
hasReadStreamToEnd
boolean hasReadStreamToEnd()
Returns whether the renderer has read the currentSampleStream
to the end.This method may be called when the renderer is in the following states:
STATE_ENABLED
,STATE_STARTED
.
-
getReadingPositionUs
long getReadingPositionUs()
Returns the renderer time up to which the renderer has read samples, in microseconds, orC.TIME_END_OF_SOURCE
if the renderer has read the currentSampleStream
to the end.This method may be called when the renderer is in the following states:
STATE_ENABLED
,STATE_STARTED
.
-
setCurrentStreamFinal
void setCurrentStreamFinal()
Signals to the renderer that the currentSampleStream
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
.
-
isCurrentStreamFinal
boolean isCurrentStreamFinal()
Returns whether the currentSampleStream
will be the final one supplied before the renderer is next disabled or reset.
-
maybeThrowStreamError
void maybeThrowStreamError() throws IOException
Throws an error that's preventing the renderer from reading from itsSampleStream
. Does nothing if no such error exists.This method may be called when the renderer is in the following states:
STATE_ENABLED
,STATE_STARTED
.- Throws:
IOException
- An error that's preventing the renderer from making progress or buffering more data.
-
resetPosition
void resetPosition(long positionUs) throws ExoPlaybackException
Signals to the renderer that a position discontinuity has occurred.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
.- Parameters:
positionUs
- The new playback position in microseconds.- Throws:
ExoPlaybackException
- If an error occurs handling the reset.
-
setPlaybackSpeed
default void setPlaybackSpeed(float currentPlaybackSpeed, float targetPlaybackSpeed) throws ExoPlaybackException
Indicates the playback speed to this renderer.The default implementation is a no-op.
- Parameters:
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 fromcurrentPlaybackSpeed
, for example, if the speed is temporarily adjusted for live playback.- Throws:
ExoPlaybackException
- If an error occurs handling the playback speed.
-
render
void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException
Incrementally renders theSampleStream
.If the renderer is in the
STATE_ENABLED
state then each call to this method will do work toward being ready to render theSampleStream
when the renderer is started. If the renderer is in theSTATE_STARTED
state then calls to this method will render theSampleStream
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 callingenable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)
withmayRenderStartOfStream
set tofalse
.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
.- Parameters:
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.- Throws:
ExoPlaybackException
- If an error occurs.
-
isReady
boolean isReady()
Whether the renderer is able to immediately render media from the current position.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
.- Returns:
- Whether the renderer is ready to render media.
-
isEnded
boolean isEnded()
Whether the renderer is ready for theExoPlayer
instance to transition toPlayer.STATE_ENDED
. The player will make this transition as soon astrue
is returned by all of its renderers.This method may be called when the renderer is in the following states:
STATE_ENABLED
,STATE_STARTED
.- Returns:
- Whether the renderer is ready for the player to transition to the ended state.
-
stop
void stop()
Stops the renderer, transitioning it to theSTATE_ENABLED
state.This method may be called when the renderer is in the following states:
STATE_STARTED
.
-
disable
void disable()
Disable the renderer, transitioning it to theSTATE_DISABLED
state.This method may be called when the renderer is in the following states:
STATE_ENABLED
.
-
reset
void reset()
Forces the renderer to give up any resources (e.g. media decoders) that it may be holding. If the renderer is not holding any resources, the call is a no-op.This method may be called when the renderer is in the following states:
STATE_DISABLED
.
-
-