Class BaseRenderer
- java.lang.Object
-
- com.google.android.exoplayer2.BaseRenderer
-
- All Implemented Interfaces:
PlayerMessage.Target
,Renderer
,RendererCapabilities
- Direct Known Subclasses:
CameraMotionRenderer
,DecoderAudioRenderer
,DecoderVideoRenderer
,FakeRenderer
,MediaCodecRenderer
,MetadataRenderer
,TextRenderer
public abstract class BaseRenderer extends Object implements Renderer, RendererCapabilities
An abstract base class suitable for mostRenderer
implementations.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface com.google.android.exoplayer2.Renderer
Renderer.MessageType, Renderer.State, Renderer.WakeupListener
-
Nested classes/interfaces inherited from interface com.google.android.exoplayer2.RendererCapabilities
RendererCapabilities.AdaptiveSupport, RendererCapabilities.Capabilities, RendererCapabilities.DecoderSupport, RendererCapabilities.FormatSupport, RendererCapabilities.HardwareAccelerationSupport, RendererCapabilities.TunnelingSupport
-
-
Field Summary
-
Fields inherited from interface com.google.android.exoplayer2.Renderer
MSG_CUSTOM_BASE, MSG_SET_AUDIO_ATTRIBUTES, MSG_SET_AUDIO_SESSION_ID, MSG_SET_AUX_EFFECT_INFO, MSG_SET_CAMERA_MOTION_LISTENER, MSG_SET_CHANGE_FRAME_RATE_STRATEGY, MSG_SET_SCALING_MODE, MSG_SET_SKIP_SILENCE_ENABLED, MSG_SET_VIDEO_FRAME_METADATA_LISTENER, MSG_SET_VIDEO_OUTPUT, MSG_SET_VOLUME, MSG_SET_WAKEUP_LISTENER, STATE_DISABLED, STATE_ENABLED, STATE_STARTED
-
Fields inherited from interface com.google.android.exoplayer2.RendererCapabilities
ADAPTIVE_NOT_SEAMLESS, ADAPTIVE_NOT_SUPPORTED, ADAPTIVE_SEAMLESS, ADAPTIVE_SUPPORT_MASK, DECODER_SUPPORT_FALLBACK, DECODER_SUPPORT_PRIMARY, FORMAT_EXCEEDS_CAPABILITIES, FORMAT_HANDLED, FORMAT_SUPPORT_MASK, FORMAT_UNSUPPORTED_DRM, FORMAT_UNSUPPORTED_SUBTYPE, FORMAT_UNSUPPORTED_TYPE, HARDWARE_ACCELERATION_NOT_SUPPORTED, HARDWARE_ACCELERATION_SUPPORT_MASK, HARDWARE_ACCELERATION_SUPPORTED, MODE_SUPPORT_MASK, TUNNELING_NOT_SUPPORTED, TUNNELING_SUPPORT_MASK, TUNNELING_SUPPORTED
-
-
Constructor Summary
Constructors Constructor Description BaseRenderer(@com.google.android.exoplayer2.C.TrackType int trackType)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected ExoPlaybackException
createRendererException(Throwable cause, Format format, @com.google.android.exoplayer2.PlaybackException.ErrorCode int errorCode)
Creates anExoPlaybackException
of typeExoPlaybackException.TYPE_RENDERER
for this renderer.protected ExoPlaybackException
createRendererException(Throwable cause, Format format, boolean isRecoverable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int errorCode)
Creates anExoPlaybackException
of typeExoPlaybackException.TYPE_RENDERER
for this renderer.void
disable()
Disable the renderer, transitioning it to theRenderer.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 specifiedSampleStream
.RendererCapabilities
getCapabilities()
Returns the capabilities of the renderer.protected RendererConfiguration
getConfiguration()
Returns the configuration set when the renderer was most recently enabled.protected FormatHolder
getFormatHolder()
Returns a clearFormatHolder
.protected int
getIndex()
Returns the index of the renderer within the player.protected long
getLastResetPositionUs()
Returns the position passed to the most recent call toenable(com.google.android.exoplayer2.RendererConfiguration, com.google.android.exoplayer2.Format[], com.google.android.exoplayer2.source.SampleStream, long, boolean, boolean, long, long)
orresetPosition(long)
.MediaClock
getMediaClock()
If the renderer advances its own playback position then this method returns a correspondingMediaClock
.protected PlayerId
getPlayerId()
Returns thePlayerId
of the player using this renderer.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.protected Format[]
getStreamFormats()
Returns the formats of the currently enabled stream.@com.google.android.exoplayer2.C.TrackType int
getTrackType()
Returns the track type that the renderer handles.void
handleMessage(@com.google.android.exoplayer2.Renderer.MessageType int messageType, Object message)
Handles a message delivered to the target.boolean
hasReadStreamToEnd()
Returns whether the renderer has read the currentSampleStream
to the end.void
init(int index, PlayerId playerId)
Initializes the renderer for playback with a player.boolean
isCurrentStreamFinal()
Returns whether the currentSampleStream
will be the final one supplied before the renderer is next disabled or reset.protected boolean
isSourceReady()
Returns whether the upstream source is ready.void
maybeThrowStreamError()
Throws an error that's preventing the renderer from reading from itsSampleStream
.protected void
onDisabled()
Called when the renderer is disabled.protected void
onEnabled(boolean joining, boolean mayRenderStartOfStream)
Called when the renderer is enabled.protected void
onPositionReset(long positionUs, boolean joining)
Called when the position is reset.protected void
onReset()
Called when the renderer is reset.protected void
onStarted()
Called when the renderer is started.protected void
onStopped()
Called when the renderer is stopped.protected void
onStreamChanged(Format[] formats, long startPositionUs, long offsetUs)
Called when the renderer's stream has changed.protected @com.google.android.exoplayer2.source.SampleStream.ReadDataResult int
readSource(FormatHolder formatHolder, DecoderInputBuffer buffer, @com.google.android.exoplayer2.source.SampleStream.ReadFlags int readFlags)
Reads from the enabled upstream source.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.protected int
skipSource(long positionUs)
Attempts to skip to the keyframe before the specified position, or to the end of the stream ifpositionUs
is beyond it.void
start()
Starts the renderer, meaning that calls toRenderer.render(long, long)
will cause media to be rendered.void
stop()
Stops the renderer, transitioning it to theRenderer.STATE_ENABLED
state.@com.google.android.exoplayer2.RendererCapabilities.AdaptiveSupport int
supportsMixedMimeTypeAdaptation()
Returns the extent to which theRenderer
supports adapting between supported formats that have different MIME types.-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface com.google.android.exoplayer2.Renderer
getName, isEnded, isReady, render, setPlaybackSpeed
-
Methods inherited from interface com.google.android.exoplayer2.RendererCapabilities
getName, supportsFormat
-
-
-
-
Constructor Detail
-
BaseRenderer
public BaseRenderer(@com.google.android.exoplayer2.C.TrackType int trackType)
- Parameters:
trackType
- The track type that the renderer handles. One of theC
TRACK_TYPE_*
constants.
-
-
Method Detail
-
getTrackType
public final @com.google.android.exoplayer2.C.TrackType int getTrackType()
Description copied from interface:Renderer
Returns the track type that the renderer handles.- Specified by:
getTrackType
in interfaceRenderer
- Specified by:
getTrackType
in interfaceRendererCapabilities
- Returns:
- The
track type
. - See Also:
ExoPlayer.getRendererType(int)
-
getCapabilities
public final RendererCapabilities getCapabilities()
Description copied from interface:Renderer
Returns the capabilities of the renderer.- Specified by:
getCapabilities
in interfaceRenderer
- Returns:
- The capabilities of the renderer.
-
init
public final void init(int index, PlayerId playerId)
Description copied from interface:Renderer
Initializes the renderer for playback with a player.
-
getMediaClock
@Nullable public MediaClock getMediaClock()
Description copied from interface:Renderer
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.- Specified by:
getMediaClock
in interfaceRenderer
- Returns:
- The
MediaClock
tracking the playback position of the renderer, or null.
-
getState
public final int getState()
Description copied from interface:Renderer
Returns the current state of the renderer.- Specified by:
getState
in interfaceRenderer
- Returns:
- The current state. One of
Renderer.STATE_DISABLED
,Renderer.STATE_ENABLED
andRenderer.STATE_STARTED
.
-
enable
public final void enable(RendererConfiguration configuration, Format[] formats, SampleStream stream, long positionUs, boolean joining, boolean mayRenderStartOfStream, long startPositionUs, long offsetUs) throws ExoPlaybackException
Description copied from interface:Renderer
Enables the renderer to consume from the specifiedSampleStream
.This method may be called when the renderer is in the following states:
Renderer.STATE_DISABLED
.- Specified by:
enable
in interfaceRenderer
- 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 notRenderer.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 fromstream
before they are rendered.- Throws:
ExoPlaybackException
- If an error occurs.
-
start
public final void start() throws ExoPlaybackException
Description copied from interface:Renderer
Starts the renderer, meaning that calls toRenderer.render(long, long)
will cause media to be rendered.This method may be called when the renderer is in the following states:
Renderer.STATE_ENABLED
.- Specified by:
start
in interfaceRenderer
- Throws:
ExoPlaybackException
- If an error occurs.
-
replaceStream
public final void replaceStream(Format[] formats, SampleStream stream, long startPositionUs, long offsetUs) throws ExoPlaybackException
Description copied from interface:Renderer
Replaces theSampleStream
from which samples will be consumed.This method may be called when the renderer is in the following states:
Renderer.STATE_ENABLED
,Renderer.STATE_STARTED
.- Specified by:
replaceStream
in interfaceRenderer
- 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 public final SampleStream getStream()
Description copied from interface:Renderer
Returns theSampleStream
being consumed, or null if the renderer is disabled.
-
hasReadStreamToEnd
public final boolean hasReadStreamToEnd()
Description copied from interface:Renderer
Returns whether the renderer has read the currentSampleStream
to the end.This method may be called when the renderer is in the following states:
Renderer.STATE_ENABLED
,Renderer.STATE_STARTED
.- Specified by:
hasReadStreamToEnd
in interfaceRenderer
-
getReadingPositionUs
public final long getReadingPositionUs()
Description copied from interface:Renderer
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:
Renderer.STATE_ENABLED
,Renderer.STATE_STARTED
.- Specified by:
getReadingPositionUs
in interfaceRenderer
-
setCurrentStreamFinal
public final void setCurrentStreamFinal()
Description copied from interface:Renderer
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:
Renderer.STATE_ENABLED
,Renderer.STATE_STARTED
.- Specified by:
setCurrentStreamFinal
in interfaceRenderer
-
isCurrentStreamFinal
public final boolean isCurrentStreamFinal()
Description copied from interface:Renderer
Returns whether the currentSampleStream
will be the final one supplied before the renderer is next disabled or reset.- Specified by:
isCurrentStreamFinal
in interfaceRenderer
-
maybeThrowStreamError
public final void maybeThrowStreamError() throws IOException
Description copied from interface:Renderer
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:
Renderer.STATE_ENABLED
,Renderer.STATE_STARTED
.- Specified by:
maybeThrowStreamError
in interfaceRenderer
- Throws:
IOException
- An error that's preventing the renderer from making progress or buffering more data.
-
resetPosition
public final void resetPosition(long positionUs) throws ExoPlaybackException
Description copied from interface:Renderer
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:
Renderer.STATE_ENABLED
,Renderer.STATE_STARTED
.- Specified by:
resetPosition
in interfaceRenderer
- Parameters:
positionUs
- The new playback position in microseconds.- Throws:
ExoPlaybackException
- If an error occurs handling the reset.
-
stop
public final void stop()
Description copied from interface:Renderer
Stops the renderer, transitioning it to theRenderer.STATE_ENABLED
state.This method may be called when the renderer is in the following states:
Renderer.STATE_STARTED
.
-
disable
public final void disable()
Description copied from interface:Renderer
Disable the renderer, transitioning it to theRenderer.STATE_DISABLED
state.This method may be called when the renderer is in the following states:
Renderer.STATE_ENABLED
.
-
reset
public final void reset()
Description copied from interface:Renderer
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:
Renderer.STATE_DISABLED
.
-
supportsMixedMimeTypeAdaptation
public @com.google.android.exoplayer2.RendererCapabilities.AdaptiveSupport int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException
Description copied from interface:RendererCapabilities
Returns the extent to which theRenderer
supports adapting between supported formats that have different MIME types.- Specified by:
supportsMixedMimeTypeAdaptation
in interfaceRendererCapabilities
- Returns:
- The
RendererCapabilities.AdaptiveSupport
for adapting between supported formats that have different MIME types. - Throws:
ExoPlaybackException
- If an error occurs.
-
handleMessage
public void handleMessage(@com.google.android.exoplayer2.Renderer.MessageType int messageType, @Nullable Object message) throws ExoPlaybackException
Description copied from interface:PlayerMessage.Target
Handles a message delivered to the target.- Specified by:
handleMessage
in interfacePlayerMessage.Target
- Parameters:
messageType
- The message type.message
- The message payload.- Throws:
ExoPlaybackException
- If an error occurred whilst handling the message. Should only be thrown by targets that handle messages on the playback thread.
-
onEnabled
protected void onEnabled(boolean joining, boolean mayRenderStartOfStream) throws ExoPlaybackException
Called when the renderer is enabled.The default implementation is a no-op.
- Parameters:
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 notRenderer.STATE_STARTED
yet.- Throws:
ExoPlaybackException
- If an error occurs.
-
onStreamChanged
protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs) throws ExoPlaybackException
Called when the renderer's stream has changed. This occurs when the renderer is enabled afteronEnabled(boolean, boolean)
has been called, and also when the stream has been replaced whilst the renderer is enabled or started.The default implementation is a no-op.
- Parameters:
formats
- The enabled formats.startPositionUs
- The start position of the new stream in renderer time (microseconds).offsetUs
- The offset that will be added to the timestamps of buffers read viareadSource(com.google.android.exoplayer2.FormatHolder, com.google.android.exoplayer2.decoder.DecoderInputBuffer, @com.google.android.exoplayer2.source.SampleStream.ReadFlags int)
so that decoder input buffers have monotonically increasing timestamps.- Throws:
ExoPlaybackException
- If an error occurs.
-
onPositionReset
protected void onPositionReset(long positionUs, boolean joining) throws ExoPlaybackException
Called when the position is reset. This occurs when the renderer is enabled afteronStreamChanged(Format[], long, long)
has been called, and also when a position discontinuity is encountered.After a position reset, the renderer's
SampleStream
is guaranteed to provide samples starting from a key frame.The default implementation is a no-op.
- Parameters:
positionUs
- The new playback position in microseconds.joining
- Whether this renderer is being enabled to join an ongoing playback.- Throws:
ExoPlaybackException
- If an error occurs.
-
onStarted
protected void onStarted() throws ExoPlaybackException
Called when the renderer is started.The default implementation is a no-op.
- Throws:
ExoPlaybackException
- If an error occurs.
-
onStopped
protected void onStopped()
Called when the renderer is stopped.The default implementation is a no-op.
-
onDisabled
protected void onDisabled()
Called when the renderer is disabled.The default implementation is a no-op.
-
onReset
protected void onReset()
Called when the renderer is reset.The default implementation is a no-op.
-
getLastResetPositionUs
protected final long getLastResetPositionUs()
Returns the position passed to the most recent call toenable(com.google.android.exoplayer2.RendererConfiguration, com.google.android.exoplayer2.Format[], com.google.android.exoplayer2.source.SampleStream, long, boolean, boolean, long, long)
orresetPosition(long)
.
-
getFormatHolder
protected final FormatHolder getFormatHolder()
Returns a clearFormatHolder
.
-
getStreamFormats
protected final Format[] getStreamFormats()
Returns the formats of the currently enabled stream.This method may be called when the renderer is in the following states:
Renderer.STATE_ENABLED
,Renderer.STATE_STARTED
.
-
getConfiguration
protected final RendererConfiguration getConfiguration()
Returns the configuration set when the renderer was most recently enabled.This method may be called when the renderer is in the following states:
Renderer.STATE_ENABLED
,Renderer.STATE_STARTED
.
-
getIndex
protected final int getIndex()
Returns the index of the renderer within the player.Must only be used after the renderer has been initialized by the player.
-
getPlayerId
protected final PlayerId getPlayerId()
Returns thePlayerId
of the player using this renderer.Must only be used after the renderer has been initialized by the player.
-
createRendererException
protected final ExoPlaybackException createRendererException(Throwable cause, @Nullable Format format, @ErrorCode @com.google.android.exoplayer2.PlaybackException.ErrorCode int errorCode)
Creates anExoPlaybackException
of typeExoPlaybackException.TYPE_RENDERER
for this renderer.- Parameters:
cause
- The cause of the exception.format
- The current format used by the renderer. May be null.errorCode
- APlaybackException.ErrorCode
to identify the cause of the playback failure.- Returns:
- The created instance, in which
ExoPlaybackException.isRecoverable
isfalse
.
-
createRendererException
protected final ExoPlaybackException createRendererException(Throwable cause, @Nullable Format format, boolean isRecoverable, @ErrorCode @com.google.android.exoplayer2.PlaybackException.ErrorCode int errorCode)
Creates anExoPlaybackException
of typeExoPlaybackException.TYPE_RENDERER
for this renderer.- Parameters:
cause
- The cause of the exception.format
- The current format used by the renderer. May be null.isRecoverable
- If the error is recoverable by disabling and re-enabling the renderer.errorCode
- APlaybackException.ErrorCode
to identify the cause of the playback failure.- Returns:
- The created instance.
-
readSource
protected final @com.google.android.exoplayer2.source.SampleStream.ReadDataResult int readSource(FormatHolder formatHolder, DecoderInputBuffer buffer, @com.google.android.exoplayer2.source.SampleStream.ReadFlags int readFlags)
Reads from the enabled upstream source. If the upstream source has been read to the end thenC.RESULT_BUFFER_READ
is only returned ifsetCurrentStreamFinal()
has been called.C.RESULT_NOTHING_READ
is returned otherwise.This method may be called when the renderer is in the following states:
Renderer.STATE_ENABLED
,Renderer.STATE_STARTED
.- Parameters:
formatHolder
- AFormatHolder
to populate in the case of reading a format.buffer
- ADecoderInputBuffer
to populate in the case of reading a sample or the end of the stream. If the end of the stream has been reached, theC.BUFFER_FLAG_END_OF_STREAM
flag will be set on the buffer.readFlags
- Flags controlling the behavior of this read operation.- Returns:
- The
result
of the read operation. - Throws:
DecoderInputBuffer.InsufficientCapacityException
- If thebuffer
has insufficient capacity to hold the data of a sample being read. The buffertimestamp
and flags are populated if this exception is thrown, but the read position is not advanced.
-
skipSource
protected int skipSource(long positionUs)
Attempts to skip to the keyframe before the specified position, or to the end of the stream ifpositionUs
is beyond it.This method may be called when the renderer is in the following states:
Renderer.STATE_ENABLED
,Renderer.STATE_STARTED
.- Parameters:
positionUs
- The position in microseconds.- Returns:
- The number of samples that were skipped.
-
isSourceReady
protected final boolean isSourceReady()
Returns whether the upstream source is ready.This method may be called when the renderer is in the following states:
Renderer.STATE_ENABLED
,Renderer.STATE_STARTED
.
-
-