Class DecoderAudioRenderer<T extends Decoder<DecoderInputBuffer,? extends SimpleDecoderOutputBuffer,? extends DecoderException>>
- java.lang.Object
-
- com.google.android.exoplayer2.BaseRenderer
-
- com.google.android.exoplayer2.audio.DecoderAudioRenderer<T>
-
- All Implemented Interfaces:
PlayerMessage.Target
,Renderer
,RendererCapabilities
,MediaClock
- Direct Known Subclasses:
FfmpegAudioRenderer
,LibflacAudioRenderer
,LibopusAudioRenderer
public abstract class DecoderAudioRenderer<T extends Decoder<DecoderInputBuffer,? extends SimpleDecoderOutputBuffer,? extends DecoderException>> extends BaseRenderer implements MediaClock
Decodes and renders audio using aDecoder
.This renderer accepts the following messages sent via
ExoPlayer.createMessage(Target)
on the playback thread:- Message with type
Renderer.MSG_SET_VOLUME
to set the volume. The message payload should be aFloat
with 0 being silence and 1 being unity gain. - Message with type
Renderer.MSG_SET_AUDIO_ATTRIBUTES
to set the audio attributes. The message payload should be anAudioAttributes
instance that will configure the underlying audio track. - Message with type
Renderer.MSG_SET_AUX_EFFECT_INFO
to set the auxiliary effect. The message payload should be anAuxEffectInfo
instance that will configure the underlying audio track. - Message with type
Renderer.MSG_SET_SKIP_SILENCE_ENABLED
to enable or disable skipping silences. The message payload should be aBoolean
. - Message with type
Renderer.MSG_SET_AUDIO_SESSION_ID
to set the audio session ID. The message payload should be a session IDInteger
that will be attached to the underlying audio track.
-
-
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 DecoderAudioRenderer()
DecoderAudioRenderer(Handler eventHandler, AudioRendererEventListener eventListener, AudioCapabilities audioCapabilities, AudioProcessor... audioProcessors)
DecoderAudioRenderer(Handler eventHandler, AudioRendererEventListener eventListener, AudioProcessor... audioProcessors)
DecoderAudioRenderer(Handler eventHandler, AudioRendererEventListener eventListener, AudioSink audioSink)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected DecoderReuseEvaluation
canReuseDecoder(String decoderName, Format oldFormat, Format newFormat)
Evaluates whether the existing decoder can be reused for a newFormat
.protected abstract T
createDecoder(Format format, CryptoConfig cryptoConfig)
Creates a decoder for the given format.void
experimentalSetEnableKeepAudioTrackOnSeek(boolean enableKeepAudioTrackOnSeek)
Sets whether to enable the experimental feature that keeps and flushes theAudioTrack
when a seek occurs, as opposed to releasing and reinitialising.MediaClock
getMediaClock()
If the renderer advances its own playback position then this method returns a correspondingMediaClock
.protected abstract Format
getOutputFormat(T decoder)
Returns the format of audio buffers output by the decoder.PlaybackParameters
getPlaybackParameters()
Returns the active playback parameters.long
getPositionUs()
Returns the current media position in microseconds.protected @com.google.android.exoplayer2.audio.AudioSink.SinkFormatSupport int
getSinkFormatSupport(Format format)
void
handleMessage(@com.google.android.exoplayer2.Renderer.MessageType int messageType, Object message)
Handles a message delivered to the target.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.protected void
onDisabled()
Called when the renderer is disabled.protected void
onEnabled(boolean joining, boolean mayRenderStartOfStream)
Called when the renderer is enabled.protected void
onPositionDiscontinuity()
protected void
onPositionReset(long positionUs, boolean joining)
Called when the position is reset.protected void
onQueueInputBuffer(DecoderInputBuffer buffer)
protected void
onStarted()
Called when the renderer is started.protected void
onStopped()
Called when the renderer is stopped.void
render(long positionUs, long elapsedRealtimeUs)
Incrementally renders theSampleStream
.void
setPlaybackParameters(PlaybackParameters playbackParameters)
Attempts to set the playback parameters.protected boolean
sinkSupportsFormat(Format format)
@com.google.android.exoplayer2.RendererCapabilities.Capabilities int
supportsFormat(Format format)
Returns the extent to which theRenderer
supports a given format.protected abstract @com.google.android.exoplayer2.C.FormatSupport int
supportsFormatInternal(Format format)
Returns theC.FormatSupport
for the givenFormat
.-
Methods inherited from class com.google.android.exoplayer2.BaseRenderer
createRendererException, createRendererException, disable, enable, getCapabilities, getConfiguration, getFormatHolder, getIndex, getLastResetPositionUs, getPlayerId, getReadingPositionUs, getState, getStream, getStreamFormats, getTrackType, hasReadStreamToEnd, init, isCurrentStreamFinal, isSourceReady, maybeThrowStreamError, onReset, onStreamChanged, readSource, replaceStream, reset, resetPosition, setCurrentStreamFinal, skipSource, start, stop, supportsMixedMimeTypeAdaptation
-
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, setPlaybackSpeed
-
Methods inherited from interface com.google.android.exoplayer2.RendererCapabilities
getName
-
-
-
-
Constructor Detail
-
DecoderAudioRenderer
public DecoderAudioRenderer()
-
DecoderAudioRenderer
public DecoderAudioRenderer(@Nullable Handler eventHandler, @Nullable AudioRendererEventListener eventListener, AudioProcessor... audioProcessors)
- Parameters:
eventHandler
- A handler to use when delivering events toeventListener
. May be null if delivery of events is not required.eventListener
- A listener of events. May be null if delivery of events is not required.audioProcessors
- OptionalAudioProcessor
s that will process audio before output.
-
DecoderAudioRenderer
public DecoderAudioRenderer(@Nullable Handler eventHandler, @Nullable AudioRendererEventListener eventListener, AudioCapabilities audioCapabilities, AudioProcessor... audioProcessors)
- Parameters:
eventHandler
- A handler to use when delivering events toeventListener
. May be null if delivery of events is not required.eventListener
- A listener of events. May be null if delivery of events is not required.audioCapabilities
- The audio capabilities for playback on this device. UseAudioCapabilities.DEFAULT_AUDIO_CAPABILITIES
if default capabilities (no encoded audio passthrough support) should be assumed.audioProcessors
- OptionalAudioProcessor
s that will process audio before output.
-
DecoderAudioRenderer
public DecoderAudioRenderer(@Nullable Handler eventHandler, @Nullable AudioRendererEventListener eventListener, AudioSink audioSink)
- Parameters:
eventHandler
- A handler to use when delivering events toeventListener
. May be null if delivery of events is not required.eventListener
- A listener of events. May be null if delivery of events is not required.audioSink
- The sink to which audio will be output.
-
-
Method Detail
-
experimentalSetEnableKeepAudioTrackOnSeek
public void experimentalSetEnableKeepAudioTrackOnSeek(boolean enableKeepAudioTrackOnSeek)
Sets whether to enable the experimental feature that keeps and flushes theAudioTrack
when a seek occurs, as opposed to releasing and reinitialising. Off by default.This method is experimental, and will be renamed or removed in a future release.
- Parameters:
enableKeepAudioTrackOnSeek
- Whether to keep theAudioTrack
on seek.
-
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
- Overrides:
getMediaClock
in classBaseRenderer
- Returns:
- The
MediaClock
tracking the playback position of the renderer, or null.
-
supportsFormat
public final @com.google.android.exoplayer2.RendererCapabilities.Capabilities int supportsFormat(Format format)
Description copied from interface:RendererCapabilities
Returns the extent to which theRenderer
supports a given format.- Specified by:
supportsFormat
in interfaceRendererCapabilities
- Parameters:
format
- The format.- Returns:
- The
RendererCapabilities.Capabilities
for this format.
-
supportsFormatInternal
@FormatSupport protected abstract @com.google.android.exoplayer2.C.FormatSupport int supportsFormatInternal(Format format)
Returns theC.FormatSupport
for the givenFormat
.- Parameters:
format
- The format, which has an audioFormat.sampleMimeType
.- Returns:
- The
C.FormatSupport
for thisFormat
.
-
sinkSupportsFormat
protected final boolean sinkSupportsFormat(Format format)
- See Also:
AudioSink.supportsFormat(Format)
-
getSinkFormatSupport
protected final @com.google.android.exoplayer2.audio.AudioSink.SinkFormatSupport int getSinkFormatSupport(Format format)
- See Also:
(Format)
-
render
public void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException
Description copied from interface:Renderer
Incrementally renders theSampleStream
.If the renderer is in the
Renderer.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 theRenderer.STATE_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
Renderer.STATE_ENABLED
state, unless it's the initial start of the media after callingRenderer.enable(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:
Renderer.STATE_ENABLED
,Renderer.STATE_STARTED
.- Specified by:
render
in interfaceRenderer
- 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.
-
onPositionDiscontinuity
@CallSuper protected void onPositionDiscontinuity()
-
createDecoder
protected abstract T createDecoder(Format format, @Nullable CryptoConfig cryptoConfig) throws DecoderException
Creates a decoder for the given format.- Parameters:
format
- The format for which a decoder is required.cryptoConfig
- TheCryptoConfig
object required for decoding encrypted content. May be null and can be ignored if decoder does not handle encrypted content.- Returns:
- The decoder.
- Throws:
DecoderException
- If an error occurred creating a suitable decoder.
-
getOutputFormat
protected abstract Format getOutputFormat(T decoder)
Returns the format of audio buffers output by the decoder. Will not be called until the first output buffer has been dequeued, so the decoder may use input data to determine the format.- Parameters:
decoder
- The decoder.
-
canReuseDecoder
protected DecoderReuseEvaluation canReuseDecoder(String decoderName, Format oldFormat, Format newFormat)
Evaluates whether the existing decoder can be reused for a newFormat
.The default implementation does not allow decoder reuse.
- Parameters:
decoderName
- The name of the decoder.oldFormat
- The previous format.newFormat
- The new format.- Returns:
- The result of the evaluation.
-
isEnded
public boolean isEnded()
Description copied from interface:Renderer
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:
Renderer.STATE_ENABLED
,Renderer.STATE_STARTED
.
-
isReady
public boolean isReady()
Description copied from interface:Renderer
Whether the renderer is able to immediately render media from the current position.If the renderer is in the
Renderer.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
Renderer.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:
Renderer.STATE_ENABLED
,Renderer.STATE_STARTED
.
-
getPositionUs
public long getPositionUs()
Description copied from interface:MediaClock
Returns the current media position in microseconds.- Specified by:
getPositionUs
in interfaceMediaClock
-
setPlaybackParameters
public void setPlaybackParameters(PlaybackParameters playbackParameters)
Description copied from interface:MediaClock
Attempts to set the playback parameters. The media clock may override the speed if changing the playback parameters is not supported.- Specified by:
setPlaybackParameters
in interfaceMediaClock
- Parameters:
playbackParameters
- The playback parameters to attempt to set.
-
getPlaybackParameters
public PlaybackParameters getPlaybackParameters()
Description copied from interface:MediaClock
Returns the active playback parameters.- Specified by:
getPlaybackParameters
in interfaceMediaClock
-
onEnabled
protected void onEnabled(boolean joining, boolean mayRenderStartOfStream) throws ExoPlaybackException
Description copied from class:BaseRenderer
Called when the renderer is enabled.The default implementation is a no-op.
- Overrides:
onEnabled
in classBaseRenderer
- 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.
-
onPositionReset
protected void onPositionReset(long positionUs, boolean joining) throws ExoPlaybackException
Description copied from class:BaseRenderer
Called when the position is reset. This occurs when the renderer is enabled afterBaseRenderer.onStreamChanged(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.
- Overrides:
onPositionReset
in classBaseRenderer
- 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()
Description copied from class:BaseRenderer
Called when the renderer is started.The default implementation is a no-op.
- Overrides:
onStarted
in classBaseRenderer
-
onStopped
protected void onStopped()
Description copied from class:BaseRenderer
Called when the renderer is stopped.The default implementation is a no-op.
- Overrides:
onStopped
in classBaseRenderer
-
onDisabled
protected void onDisabled()
Description copied from class:BaseRenderer
Called when the renderer is disabled.The default implementation is a no-op.
- Overrides:
onDisabled
in classBaseRenderer
-
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
- Overrides:
handleMessage
in classBaseRenderer
- 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.
-
onQueueInputBuffer
protected void onQueueInputBuffer(DecoderInputBuffer buffer)
-
-