public class MediaCodecAudioTrackRenderer extends MediaCodecTrackRenderer implements MediaClock
MediaCodec
and AudioTrack
.Modifier and Type | Class and Description |
---|---|
static interface |
MediaCodecAudioTrackRenderer.EventListener
Interface definition for a callback to be notified of
MediaCodecAudioTrackRenderer
events. |
MediaCodecTrackRenderer.DecoderInitializationException
codecCounters, eventHandler, SOURCE_STATE_NOT_READY, SOURCE_STATE_READY, SOURCE_STATE_READY_READ_MAY_FAIL
END_OF_TRACK_US, MATCH_LONGEST_US, STATE_ENABLED, STATE_PREPARED, STATE_RELEASED, STATE_STARTED, STATE_UNPREPARED, UNKNOWN_TIME_US
Constructor and Description |
---|
MediaCodecAudioTrackRenderer(SampleSource[] sources,
MediaCodecSelector mediaCodecSelector,
DrmSessionManager drmSessionManager,
boolean playClearSamplesWithoutKeys,
Handler eventHandler,
MediaCodecAudioTrackRenderer.EventListener eventListener,
AudioCapabilities audioCapabilities,
int streamType) |
MediaCodecAudioTrackRenderer(SampleSource source,
MediaCodecSelector mediaCodecSelector) |
MediaCodecAudioTrackRenderer(SampleSource source,
MediaCodecSelector mediaCodecSelector,
DrmSessionManager drmSessionManager,
boolean playClearSamplesWithoutKeys) |
MediaCodecAudioTrackRenderer(SampleSource source,
MediaCodecSelector mediaCodecSelector,
DrmSessionManager drmSessionManager,
boolean playClearSamplesWithoutKeys,
Handler eventHandler,
MediaCodecAudioTrackRenderer.EventListener eventListener) |
MediaCodecAudioTrackRenderer(SampleSource source,
MediaCodecSelector mediaCodecSelector,
DrmSessionManager drmSessionManager,
boolean playClearSamplesWithoutKeys,
Handler eventHandler,
MediaCodecAudioTrackRenderer.EventListener eventListener,
AudioCapabilities audioCapabilities,
int streamType) |
MediaCodecAudioTrackRenderer(SampleSource source,
MediaCodecSelector mediaCodecSelector,
Handler eventHandler,
MediaCodecAudioTrackRenderer.EventListener eventListener) |
Modifier and Type | Method and Description |
---|---|
protected boolean |
allowPassthrough(String mimeType)
Returns whether encoded audio passthrough should be used for playing back the input format.
|
protected void |
configureCodec(MediaCodec codec,
boolean codecIsAdaptive,
MediaFormat format,
MediaCrypto crypto)
Configures a newly created
MediaCodec . |
protected DecoderInfo |
getDecoderInfo(MediaCodecSelector mediaCodecSelector,
String mimeType,
boolean requiresSecureDecoder)
Returns a
DecoderInfo for a given format. |
protected MediaClock |
getMediaClock()
If the renderer advances its own playback position then this method returns a corresponding
MediaClock . |
long |
getPositionUs() |
protected void |
handleAudioTrackDiscontinuity() |
void |
handleMessage(int messageType,
Object message)
Handles a message delivered to the component.
|
protected boolean |
handlesTrack(MediaCodecSelector mediaCodecSelector,
MediaFormat mediaFormat)
Returns whether this renderer is capable of handling the provided track.
|
protected boolean |
isEnded()
Whether the renderer is ready for the
ExoPlayer instance to transition to
ExoPlayer.STATE_ENDED . |
protected boolean |
isReady()
Whether the renderer is able to immediately render media from the current position.
|
protected void |
onAudioSessionId(int audioSessionId)
Invoked when the audio session id becomes known.
|
protected void |
onDisabled()
Called when the renderer is disabled.
|
protected void |
onDiscontinuity(long positionUs)
Invoked when a discontinuity is encountered.
|
protected void |
onInputFormatChanged(MediaFormatHolder holder)
Invoked when a new format is read from the upstream
SampleSource . |
protected void |
onOutputFormatChanged(MediaCodec codec,
MediaFormat outputFormat)
Invoked when the output format of the
MediaCodec changes. |
protected void |
onOutputStreamEnded()
Invoked when the output stream ends, meaning that the last output buffer has been processed
and the
MediaCodec.BUFFER_FLAG_END_OF_STREAM flag has been propagated through the
decoder. |
protected void |
onStarted()
Called when the renderer is started.
|
protected void |
onStopped()
Called when the renderer is stopped.
|
protected boolean |
processOutputBuffer(long positionUs,
long elapsedRealtimeUs,
MediaCodec codec,
ByteBuffer buffer,
MediaCodec.BufferInfo bufferInfo,
int bufferIndex,
boolean shouldSkip)
Processes the provided output buffer.
|
canReconfigureCodec, codecInitialized, doSomeWork, flushCodec, getDequeueOutputBufferTimeoutUs, getSourceState, handlesTrack, haveFormat, maybeInitCodec, onProcessedOutputBuffer, onQueuedInputBuffer, releaseCodec, shouldInitCodec
doPrepare, doSomeWork, getBufferedPositionUs, getDurationUs, getFormat, getTrackCount, maybeThrowError, onEnabled, onReleased, readSource, seekTo, shiftInputPosition
getState
public static final int MSG_SET_VOLUME
ExoPlayer.sendMessage(com.google.android.exoplayer.ExoPlayer.ExoPlayerComponent, int, java.lang.Object)
or ExoPlayer.blockingSendMessage(com.google.android.exoplayer.ExoPlayer.ExoPlayerComponent, int, java.lang.Object)
. The message object
should be a Float
with 0 being silence and 1 being unity gain.public static final int MSG_SET_PLAYBACK_PARAMS
ExoPlayer.sendMessage(com.google.android.exoplayer.ExoPlayer.ExoPlayerComponent, int, java.lang.Object)
or ExoPlayer.blockingSendMessage(com.google.android.exoplayer.ExoPlayer.ExoPlayerComponent, int, java.lang.Object)
. The message object
should be a PlaybackParams
, which will be used to configure the
underlying AudioTrack
. The message object should not be modified by the
caller after it has been passedpublic static final int MSG_SET_STREAM_TYPE
ExoPlayer.sendMessage(com.google.android.exoplayer.ExoPlayer.ExoPlayerComponent, int, java.lang.Object)
or ExoPlayer.blockingSendMessage(com.google.android.exoplayer.ExoPlayer.ExoPlayerComponent, int, java.lang.Object)
. The message object
should be an integer stream type accepted by AudioTrack
's constructor
(see AudioTrack.AudioTrack(int, int, int, int, int, int)
).
Note that when the stream type changes, the AudioTrack must be reinitialized, which can introduce a brief gap in audio output. Note also that tracks in the same audio session must share the same routing, so a new audio session id will be generated.
public MediaCodecAudioTrackRenderer(SampleSource source, MediaCodecSelector mediaCodecSelector)
source
- The upstream source from which the renderer obtains samples.mediaCodecSelector
- A decoder selector.public MediaCodecAudioTrackRenderer(SampleSource source, MediaCodecSelector mediaCodecSelector, DrmSessionManager drmSessionManager, boolean playClearSamplesWithoutKeys)
source
- The upstream source from which the renderer obtains samples.mediaCodecSelector
- A decoder selector.drmSessionManager
- For use with encrypted content. May be null if support for encrypted
content is not required.playClearSamplesWithoutKeys
- Encrypted media may contain clear (un-encrypted) regions.
For example a media file may start with a short clear region so as to allow playback to
begin in parallel with key acquisition. This parameter specifies whether the renderer is
permitted to play clear regions of encrypted media files before drmSessionManager
has obtained the keys necessary to decrypt encrypted regions of the media.public MediaCodecAudioTrackRenderer(SampleSource source, MediaCodecSelector mediaCodecSelector, Handler eventHandler, MediaCodecAudioTrackRenderer.EventListener eventListener)
source
- The upstream source from which the renderer obtains samples.mediaCodecSelector
- A decoder selector.eventHandler
- A handler to use when delivering events to eventListener
. 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.public MediaCodecAudioTrackRenderer(SampleSource source, MediaCodecSelector mediaCodecSelector, DrmSessionManager drmSessionManager, boolean playClearSamplesWithoutKeys, Handler eventHandler, MediaCodecAudioTrackRenderer.EventListener eventListener)
source
- The upstream source from which the renderer obtains samples.mediaCodecSelector
- A decoder selector.drmSessionManager
- For use with encrypted content. May be null if support for encrypted
content is not required.playClearSamplesWithoutKeys
- Encrypted media may contain clear (un-encrypted) regions.
For example a media file may start with a short clear region so as to allow playback to
begin in parallel with key acquisition. This parameter specifies whether the renderer is
permitted to play clear regions of encrypted media files before drmSessionManager
has obtained the keys necessary to decrypt encrypted regions of the media.eventHandler
- A handler to use when delivering events to eventListener
. 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.public MediaCodecAudioTrackRenderer(SampleSource source, MediaCodecSelector mediaCodecSelector, DrmSessionManager drmSessionManager, boolean playClearSamplesWithoutKeys, Handler eventHandler, MediaCodecAudioTrackRenderer.EventListener eventListener, AudioCapabilities audioCapabilities, int streamType)
source
- The upstream source from which the renderer obtains samples.mediaCodecSelector
- A decoder selector.drmSessionManager
- For use with encrypted content. May be null if support for encrypted
content is not required.playClearSamplesWithoutKeys
- Encrypted media may contain clear (un-encrypted) regions.
For example a media file may start with a short clear region so as to allow playback to
begin in parallel with key acquisition. This parameter specifies whether the renderer is
permitted to play clear regions of encrypted media files before drmSessionManager
has obtained the keys necessary to decrypt encrypted regions of the media.eventHandler
- A handler to use when delivering events to eventListener
. 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. May be null if the
default capabilities (no encoded audio passthrough support) should be assumed.streamType
- The type of audio stream for the AudioTrack
.public MediaCodecAudioTrackRenderer(SampleSource[] sources, MediaCodecSelector mediaCodecSelector, DrmSessionManager drmSessionManager, boolean playClearSamplesWithoutKeys, Handler eventHandler, MediaCodecAudioTrackRenderer.EventListener eventListener, AudioCapabilities audioCapabilities, int streamType)
sources
- The upstream sources from which the renderer obtains samples.mediaCodecSelector
- A decoder selector.drmSessionManager
- For use with encrypted content. May be null if support for encrypted
content is not required.playClearSamplesWithoutKeys
- Encrypted media may contain clear (un-encrypted) regions.
For example a media file may start with a short clear region so as to allow playback to
begin in parallel with key acquisition. This parameter specifies whether the renderer is
permitted to play clear regions of encrypted media files before drmSessionManager
has obtained the keys necessary to decrypt encrypted regions of the media.eventHandler
- A handler to use when delivering events to eventListener
. 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. May be null if the
default capabilities (no encoded audio passthrough support) should be assumed.streamType
- The type of audio stream for the AudioTrack
.protected boolean handlesTrack(MediaCodecSelector mediaCodecSelector, MediaFormat mediaFormat) throws MediaCodecUtil.DecoderQueryException
MediaCodecTrackRenderer
handlesTrack
in class MediaCodecTrackRenderer
mediaCodecSelector
- The decoder selector.mediaFormat
- The format of the track.MediaCodecUtil.DecoderQueryException
- Thrown if there was an error querying decoders.protected DecoderInfo getDecoderInfo(MediaCodecSelector mediaCodecSelector, String mimeType, boolean requiresSecureDecoder) throws MediaCodecUtil.DecoderQueryException
MediaCodecTrackRenderer
DecoderInfo
for a given format.getDecoderInfo
in class MediaCodecTrackRenderer
mediaCodecSelector
- The decoder selector.mimeType
- The mime type for which a decoder is required.requiresSecureDecoder
- Whether a secure decoder is required.DecoderInfo
describing the decoder to instantiate, or null if no suitable
decoder exists.MediaCodecUtil.DecoderQueryException
- Thrown if there was an error querying decoders.protected boolean allowPassthrough(String mimeType)
AudioTrack
's audio capabilities indicate that
passthrough is supported.mimeType
- The type of input media.protected void configureCodec(MediaCodec codec, boolean codecIsAdaptive, MediaFormat format, MediaCrypto crypto)
MediaCodecTrackRenderer
MediaCodec
.configureCodec
in class MediaCodecTrackRenderer
codec
- The MediaCodec
to configure.codecIsAdaptive
- Whether the codec is adaptive.format
- The format for which the codec is being configured.crypto
- For drm protected playbacks, a MediaCrypto
to use for decryption.protected MediaClock getMediaClock()
TrackRenderer
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.getMediaClock
in class TrackRenderer
MediaClock
tracking the playback position of the renderer, or null.protected void onInputFormatChanged(MediaFormatHolder holder) throws ExoPlaybackException
MediaCodecTrackRenderer
SampleSource
.onInputFormatChanged
in class MediaCodecTrackRenderer
holder
- Holds the new format.ExoPlaybackException
- If an error occurs reinitializing the MediaCodec
.protected void onOutputFormatChanged(MediaCodec codec, MediaFormat outputFormat)
MediaCodecTrackRenderer
MediaCodec
changes.
The default implementation is a no-op.
onOutputFormatChanged
in class MediaCodecTrackRenderer
codec
- The MediaCodec
instance.outputFormat
- The new output format.protected void onAudioSessionId(int audioSessionId)
The default implementation is a no-op. One reason for overriding this method would be to
instantiate and enable a Virtualizer
in order to spatialize the audio channels. For
this use case, any Virtualizer
instances should be released in onDisabled()
(if not before).
audioSessionId
- The audio session id.protected void onStarted()
TrackRenderer
The default implementation is a no-op.
onStarted
in class MediaCodecTrackRenderer
protected void onStopped()
TrackRenderer
The default implementation is a no-op.
onStopped
in class MediaCodecTrackRenderer
protected boolean isEnded()
TrackRenderer
ExoPlayer
instance to transition to
ExoPlayer.STATE_ENDED
. The player will make this transition as soon as true
is
returned by all of its TrackRenderer
s.
This method may be called when the renderer is in the following states:
TrackRenderer.STATE_ENABLED
, TrackRenderer.STATE_STARTED
isEnded
in class MediaCodecTrackRenderer
protected boolean isReady()
TrackRenderer
If the renderer is in the TrackRenderer.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 TrackRenderer.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:
TrackRenderer.STATE_ENABLED
, TrackRenderer.STATE_STARTED
isReady
in class MediaCodecTrackRenderer
public long getPositionUs()
getPositionUs
in interface MediaClock
protected void onDisabled() throws ExoPlaybackException
TrackRenderer
The default implementation is a no-op.
onDisabled
in class MediaCodecTrackRenderer
ExoPlaybackException
- If an error occurs.protected void onDiscontinuity(long positionUs) throws ExoPlaybackException
SampleSourceTrackRenderer
onDiscontinuity
in class MediaCodecTrackRenderer
positionUs
- The playback position after the discontinuity, or the position at which
the renderer is being enabled.ExoPlaybackException
- If an error occurs handling the discontinuity.protected boolean processOutputBuffer(long positionUs, long elapsedRealtimeUs, MediaCodec codec, ByteBuffer buffer, MediaCodec.BufferInfo bufferInfo, int bufferIndex, boolean shouldSkip) throws ExoPlaybackException
MediaCodecTrackRenderer
processOutputBuffer
in class MediaCodecTrackRenderer
ExoPlaybackException
- If an error occurs processing the output buffer.protected void onOutputStreamEnded()
MediaCodecTrackRenderer
MediaCodec.BUFFER_FLAG_END_OF_STREAM
flag has been propagated through the
decoder.
The default implementation is a no-op.
onOutputStreamEnded
in class MediaCodecTrackRenderer
protected void handleAudioTrackDiscontinuity()
public void handleMessage(int messageType, Object message) throws ExoPlaybackException
ExoPlayer.ExoPlayerComponent
handleMessage
in interface ExoPlayer.ExoPlayerComponent
handleMessage
in class TrackRenderer
messageType
- An integer identifying the type of message.message
- The message object.ExoPlaybackException
- If an error occurred whilst handling the message.