MediaCodecRenderer
@UnstableApi
public abstract class MediaCodecRenderer extends BaseRenderer
| java.lang.Object | ||
| ↳ | androidx.media3.exoplayer.BaseRenderer | |
| ↳ | androidx.media3.exoplayer.mediacodec.MediaCodecRenderer |
MediaCodecAudioRenderer |
Decodes and renders audio using |
MediaCodecVideoRenderer |
Decodes and renders video using |
CapturingRenderersFactory.CapturingMediaCodecVideoRenderer |
A |
An abstract renderer that uses MediaCodec to decode samples for rendering.
Summary
Nested types |
|---|
public class MediaCodecRenderer.DecoderInitializationException extends ExceptionThrown when a failure occurs instantiating a decoder. |
Constants |
|
|---|---|
static final float |
CODEC_OPERATING_RATE_UNSET = -1.0fIndicates no codec operating rate should be set. |
static final boolean |
DEBUG_LOG_ENABLED = falseCompile-time flag to enable detailed logging for codec interactions. |
static final String |
DEBUG_LOG_TAG = "MCRdebug"Logging tag that should be used for all |
Protected fields |
|
|---|---|
@Nullable MediaCodecAdapter |
|
@Nullable MediaCodecInfo |
|
@Nullable Format |
|
float |
|
@Nullable MediaFormat |
|
DecoderCounters |
|
long |
|
long |
|
long |
|
@MonotonicNonNull Renderer.WakeupListener |
Public constructors |
|---|
MediaCodecRenderer( |
Public methods |
|
|---|---|
void |
Enables the renderer to invoke |
final long |
getDurationToProgressUs(long positionUs, long elapsedRealtimeUs)Returns minimum amount of playback clock time that must pass in order for the |
void |
handleMessage(Handles a message delivered to the target. |
boolean |
isEnded()Whether the renderer is ready for the |
boolean |
isReady()Whether the renderer is able to immediately render media from the current position. |
void |
render(long positionUs, long elapsedRealtimeUs)Incrementally renders the |
void |
setPlaybackSpeed(float currentPlaybackSpeed, float targetPlaybackSpeed)Indicates the playback speed to this renderer. |
void |
setRenderTimeLimitMs(long renderTimeLimitMs)Sets a limit on the time a single |
final int |
Returns the extent to which the |
final int |
Returns the extent to which the |
Protected methods |
|
|---|---|
final void |
applyCodecParametersToMediaFormat(MediaFormat mediaFormat)Applies the currently active |
DecoderReuseEvaluation |
canReuseCodec(Evaluates whether the existing |
MediaCodecDecoderException |
createDecoderException( |
final boolean |
Flushes the codec. |
final @Nullable MediaCodecAdapter |
getCodec() |
int |
Returns the flags that should be set on |
final @Nullable MediaCodecInfo |
|
final @Nullable Format |
|
float |
Returns the operating rate used by the current codec |
float |
getCodecOperatingRateV23(Returns the |
final @Nullable MediaFormat |
|
abstract List<MediaCodecInfo> |
getDecoderInfos(Returns a list of decoders that can decode media in the specified format, in priority order. |
long |
getDurationToProgressUs(Returns minimum time playback must advance in order for the |
long |
Returns the largest presentation time of a buffer queued to the decoder. |
long |
Returns the presentation time of the last buffer in the stream. |
final long |
Returns the presentation time of the last output buffer processed. |
abstract MediaCodecAdapter.Configuration |
getMediaCodecConfiguration(Returns the |
final long |
Returns the offset that should be subtracted from |
final long |
Returns the start position of the current output stream in microseconds. |
float |
Returns the current playback speed, as set by |
long |
Returns the offset added to buffer timestamps prior to decoding. |
final @Nullable Renderer.WakeupListener |
Returns listener used to signal that |
void |
Handles supplemental data associated with an input buffer. |
final boolean |
Returns whether bypass is enabled by the renderer. |
final boolean |
isBypassPossible(Format format)Returns whether buffers in the input format can be processed without a codec. |
final boolean |
Returns whether the renderer is ready to start or continue decoding. |
final void |
|
boolean |
Initializes the processing pipeline, if needed by the implementation. |
void |
onCodecError(Exception codecError)Called when a codec error has occurred. |
void |
onCodecInitialized(Called when a |
abstract void |
onCodecParametersChanged(CodecParameters codecParameters)Called when one or more of the subscribed codec parameters have changed. |
void |
onCodecReleased(String name)Called when a |
void |
Called when the renderer is disabled. |
void |
onEnabled(boolean joining, boolean mayRenderStartOfStream)Called when the renderer is enabled. |
@Nullable DecoderReuseEvaluation |
@CallSuperCalled when a new |
void |
onOutputFormatChanged(Format format, @Nullable MediaFormat mediaFormat)Called when one of the output formats changes. |
void |
onOutputStreamOffsetUsChanged(long outputStreamOffsetUs)Called after the output stream offset changes. |
void |
onPositionReset(Called when the position is reset. |
void |
@CallSuperCalled when an output buffer is successfully processed. |
void |
Called after the last output buffer before a stream change has been processed. |
void |
onQueueInputBuffer(DecoderInputBuffer buffer)Called immediately before an input buffer is queued into the codec. |
void |
onReset()Called when the renderer is reset. |
void |
Called when the renderer is started. |
void |
Called when the renderer is stopped. |
void |
onStreamChanged(Called when the renderer's stream has changed. |
abstract boolean |
processOutputBuffer(Processes an output media buffer. |
void |
|
void |
Incrementally renders any remaining output. |
void |
Resets the renderer internal state after a codec flush. |
void |
Resets the renderer internal state after a codec release. |
final void |
Notifies the renderer that output end of stream is pending and should be handled on the next render. |
final void |
setPendingPlaybackException(ExoPlaybackException exception)Sets an exception to be re-thrown by render. |
boolean |
Returns whether the input buffer should be discarded before decoding. |
boolean |
Returns whether the codec should be flushed in cases such that the codec was not released. |
boolean |
shouldInitCodec(MediaCodecInfo codecInfo) |
boolean |
Returns whether the renderer needs to re-initialize the codec, possibly as a result of a change in device capabilities. |
boolean |
Returns whether the codec should be released rather than flushed. |
boolean |
Returns whether the input buffer should be skipped before the decoder. |
boolean |
shouldUseBypass(Format format)Returns whether buffers in the input format can be processed without a codec. |
abstract int |
@RendererCapabilities.CapabilitiesReturns the |
static boolean |
supportsFormatDrm(Format format)Returns whether this renderer supports the given |
final boolean |
Updates the codec operating rate, or triggers codec release and re-initialization if a previously set operating rate needs to be cleared. |
final void |
updateOutputFormatForTime(long presentationTimeUs)Updates the output formats for the specified output buffer timestamp, calling |
Inherited Constants |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Inherited fields |
||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Inherited methods |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Constants
CODEC_OPERATING_RATE_UNSET
protected static final float CODEC_OPERATING_RATE_UNSET = -1.0f
Indicates no codec operating rate should be set.
DEBUG_LOG_ENABLED
protected static final boolean DEBUG_LOG_ENABLED = false
Compile-time flag to enable detailed logging for codec interactions.
DEBUG_LOG_TAG
protected static final String DEBUG_LOG_TAG = "MCRdebug"
Logging tag that should be used for all DEBUG_LOG_ENABLED logs.
Protected fields
Public constructors
MediaCodecRenderer
public MediaCodecRenderer(
@C.TrackType int trackType,
MediaCodecAdapter.Factory codecAdapterFactory,
MediaCodecSelector mediaCodecSelector,
boolean enableDecoderFallback,
float assumedMinimumCodecOperatingRate
)
| Parameters | |
|---|---|
@C.TrackType int trackType |
The |
MediaCodecAdapter.Factory codecAdapterFactory |
A factory for |
MediaCodecSelector mediaCodecSelector |
A decoder selector. |
boolean enableDecoderFallback |
Whether to enable fallback to lower-priority decoders if decoder initialization fails. This may result in using a decoder that is less efficient or slower than the primary decoder. |
float assumedMinimumCodecOperatingRate |
A codec operating rate that all codecs instantiated by this renderer are assumed to meet implicitly (i.e. without the operating rate being set explicitly using |
Public methods
experimentalEnableProcessedStreamChangedAtStart
public void experimentalEnableProcessedStreamChangedAtStart()
Enables the renderer to invoke onProcessedStreamChange on the first stream.
When not enabled, onProcessedStreamChange is invoked from the second stream onwards.
getDurationToProgressUs
public final long getDurationToProgressUs(long positionUs, long elapsedRealtimeUs)
Returns minimum amount of playback clock time that must pass in order for the render call to make progress.
This method may be called when the renderer is in the following states: STATE_ENABLED, STATE_STARTED.
The default return time is DEFAULT_DURATION_TO_PROGRESS_US if the renderer is in STATE_STARTED, or in STATE_ENABLED and not yet ready or ended. Otherwise, it returns DEFAULT_IDLE_DURATION_TO_PROGRESS_US.
| Parameters | |
|---|---|
long positionUs |
The current render position in microseconds, measured at the start of the current iteration of the rendering loop. |
long elapsedRealtimeUs |
|
| Returns | |
|---|---|
long |
Minimum amount of playback clock time that must pass before renderer is able to make progress. |
handleMessage
public void handleMessage(
@Renderer.MessageType int messageType,
@Nullable Object message
)
Handles a message delivered to the target.
| Parameters | |
|---|---|
@Renderer.MessageType int messageType |
The message type. |
@Nullable Object message |
The message payload. |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
If an error occurred whilst handling the message. Should only be thrown by targets that handle messages on the playback thread. |
isEnded
public boolean isEnded()
Whether the renderer is ready for the ExoPlayer instance to transition to 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.
| Returns | |
|---|---|
boolean |
Whether the renderer is ready for the player to transition to the ended state. |
isReady
public 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 | |
|---|---|
boolean |
Whether the renderer is ready to render media. |
render
public void render(long positionUs, long elapsedRealtimeUs)
Incrementally renders the 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 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.
| Parameters | |
|---|---|
long positionUs |
The current media time in microseconds, measured at the start of the current iteration of the rendering loop. |
long elapsedRealtimeUs |
|
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
If an error occurs. |
setPlaybackSpeed
public void setPlaybackSpeed(float currentPlaybackSpeed, float targetPlaybackSpeed)
Indicates the playback speed to this renderer.
The default implementation is a no-op.
| Parameters | |
|---|---|
float currentPlaybackSpeed |
The factor by which playback is currently sped up. |
float targetPlaybackSpeed |
The target factor by which playback should be sped up. This may be different from |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
If an error occurs handling the playback speed. |
setRenderTimeLimitMs
public void setRenderTimeLimitMs(long renderTimeLimitMs)
Sets a limit on the time a single render call can spend draining and filling the decoder.
This method should be called right after creating an instance of this class.
| Parameters | |
|---|---|
long renderTimeLimitMs |
The render time limit in milliseconds, or |
supportsFormat
@RendererCapabilities.Capabilities
public final int supportsFormat(Format format)
Returns the extent to which the Renderer supports a given format.
| Parameters | |
|---|---|
Format format |
The format. |
| Returns | |
|---|---|
int |
The |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
If an error occurs. |
supportsMixedMimeTypeAdaptation
@RendererCapabilities.AdaptiveSupport
public final int supportsMixedMimeTypeAdaptation()
Returns the extent to which the Renderer supports adapting between supported formats that have different MIME types.
| Returns | |
|---|---|
int |
The |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
If an error occurs. |
Protected methods
applyCodecParametersToMediaFormat
protected final void applyCodecParametersToMediaFormat(MediaFormat mediaFormat)
Applies the currently active CodecParameters to the given MediaFormat.
canReuseCodec
protected DecoderReuseEvaluation canReuseCodec(
MediaCodecInfo codecInfo,
Format oldFormat,
Format newFormat
)
Evaluates whether the existing MediaCodec can be kept for a new Format, and if it can whether it requires reconfiguration.
The default implementation does not allow decoder reuse.
| Parameters | |
|---|---|
MediaCodecInfo codecInfo |
A |
Format oldFormat |
The |
Format newFormat |
The new |
| Returns | |
|---|---|
DecoderReuseEvaluation |
The result of the evaluation. |
createDecoderException
protected MediaCodecDecoderException createDecoderException(
Throwable cause,
@Nullable MediaCodecInfo codecInfo
)
flushOrReinitializeCodec
protected final boolean flushOrReinitializeCodec()
Flushes the codec. If flushing is not possible, the codec will be released and re-instantiated. This method is a no-op if the codec is null.
The implementation of this method calls flushOrReleaseCodec, and maybeInitCodecOrBypass if the codec needs to be re-instantiated.
| Returns | |
|---|---|
boolean |
Whether the codec was released and reinitialized, rather than being flushed. |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
If an error occurs re-instantiating the codec. |
getCodecBufferFlags
protected int getCodecBufferFlags(DecoderInputBuffer buffer)
Returns the flags that should be set on queueInputBuffer or queueSecureInputBuffer for this buffer.
| Parameters | |
|---|---|
DecoderInputBuffer buffer |
The input buffer. |
| Returns | |
|---|---|
int |
The flags to set on |
getCodecOperatingRate
protected float getCodecOperatingRate()
Returns the operating rate used by the current codec
getCodecOperatingRateV23
protected float getCodecOperatingRateV23(
float targetPlaybackSpeed,
Format format,
Format[] streamFormats
)
Returns the KEY_OPERATING_RATE value for a given playback speed, current Format and set of possible stream formats.
The default implementation returns CODEC_OPERATING_RATE_UNSET.
| Parameters | |
|---|---|
float targetPlaybackSpeed |
The target factor by which playback should be sped up. This may be different from the current playback speed, for example, if the speed is temporarily adjusted for live playback. |
Format format |
The |
Format[] streamFormats |
The possible stream formats. |
| Returns | |
|---|---|
float |
The codec operating rate, or |
getDecoderInfos
protected abstract List<MediaCodecInfo> getDecoderInfos(
MediaCodecSelector mediaCodecSelector,
Format format,
boolean requiresSecureDecoder
)
Returns a list of decoders that can decode media in the specified format, in priority order.
| Parameters | |
|---|---|
MediaCodecSelector mediaCodecSelector |
The decoder selector. |
Format format |
The |
boolean requiresSecureDecoder |
Whether a secure decoder is required. |
| Returns | |
|---|---|
List<MediaCodecInfo> |
A list of |
| Throws | |
|---|---|
androidx.media3.exoplayer.mediacodec.MediaCodecUtil.DecoderQueryException |
Thrown if there was an error querying decoders. |
getDurationToProgressUs
protected long getDurationToProgressUs(
long positionUs,
long elapsedRealtimeUs,
boolean isOnBufferAvailableListenerRegistered
)
Returns minimum time playback must advance in order for the render call to make progress.
If the Renderer has a registered MediaCodecAdapter.OnBufferAvailableListener, then the Renderer will be notified when decoder input and output buffers become available. These callbacks may affect the calculated minimum time playback must advance before a render call can make progress.
| Parameters | |
|---|---|
long positionUs |
The current media time in microseconds, measured at the start of the current iteration of the rendering loop. |
long elapsedRealtimeUs |
|
boolean isOnBufferAvailableListenerRegistered |
Whether the |
| Returns | |
|---|---|
long |
minimum time playback must advance before renderer is able to make progress. |
getLargestQueuedPresentationTimeUs
protected long getLargestQueuedPresentationTimeUs()
Returns the largest presentation time of a buffer queued to the decoder.
If a buffer has not yet been queued to the decoder then the return value will be TIME_UNSET. The value is reset when the decoder is flushed or released.
| Returns | |
|---|---|
long |
The largest presentation time of buffers queued to the decoder. |
getLastBufferInStreamPresentationTimeUs
protected long getLastBufferInStreamPresentationTimeUs()
Returns the presentation time of the last buffer in the stream.
If the last buffer has not yet been read off the sample queue then the return value will be TIME_UNSET.
| Returns | |
|---|---|
long |
The presentation time of the last buffer in the stream. |
getLastProcessedOutputBufferTimeUs
protected final long getLastProcessedOutputBufferTimeUs()
Returns the presentation time of the last output buffer processed.
If an output buffer has not yet been processed then the return value will be TIME_UNSET.
| Returns | |
|---|---|
long |
The presentation time of the last output buffer processed. |
getMediaCodecConfiguration
protected abstract MediaCodecAdapter.Configuration getMediaCodecConfiguration(
MediaCodecInfo codecInfo,
Format format,
@Nullable MediaCrypto crypto,
float codecOperatingRate
)
Returns the MediaCodecAdapter.Configuration that will be used to create and configure a MediaCodec to decode the given Format for a playback.
| Parameters | |
|---|---|
MediaCodecInfo codecInfo |
Information about the |
Format format |
The |
@Nullable MediaCrypto crypto |
For drm protected playbacks, a |
float codecOperatingRate |
The codec operating rate, or |
| Returns | |
|---|---|
MediaCodecAdapter.Configuration |
The parameters needed to call configure. |
getOutputStreamOffsetUs
protected final long getOutputStreamOffsetUs()
Returns the offset that should be subtracted from bufferPresentationTimeUs in processOutputBuffer to get the playback position with respect to the media.
getOutputStreamStartPositionUs
protected final long getOutputStreamStartPositionUs()
Returns the start position of the current output stream in microseconds.
getPlaybackSpeed
protected float getPlaybackSpeed()
Returns the current playback speed, as set by setPlaybackSpeed.
getSkippedFlushOffsetUs
protected long getSkippedFlushOffsetUs()
Returns the offset added to buffer timestamps prior to decoding.
The skippedFlushOffset ensures timestamps are greater than the current "largestQueuedTimestamp" when skipping flushing the codec during a seek.
getWakeupListener
protected final @Nullable Renderer.WakeupListener getWakeupListener()
Returns listener used to signal that render should be called.
handleInputBufferSupplementalData
protected void handleInputBufferSupplementalData(DecoderInputBuffer buffer)
Handles supplemental data associated with an input buffer.
The default implementation is a no-op.
| Parameters | |
|---|---|
DecoderInputBuffer buffer |
The input buffer that is about to be queued. |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
Thrown if an error occurs handling supplemental data. |
isBypassEnabled
protected final boolean isBypassEnabled()
Returns whether bypass is enabled by the renderer.
isBypassPossible
protected final boolean isBypassPossible(Format format)
Returns whether buffers in the input format can be processed without a codec.
This method returns the possibility of bypass mode with checking both the renderer capabilities and DRM protection.
| Returns | |
|---|---|
boolean |
Whether playback bypassing |
isReadyForDecoding
protected final boolean isReadyForDecoding()
Returns whether the renderer is ready to start or continue decoding.
maybeInitializeProcessingPipeline
protected boolean maybeInitializeProcessingPipeline(Format format)
Initializes the processing pipeline, if needed by the implementation.
The default implementation is a no-op.
| Returns | |
|---|---|
boolean |
Returns |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
If an error occurs preparing for initializing the codec. |
onCodecError
protected void onCodecError(Exception codecError)
Called when a codec error has occurred.
The default implementation is a no-op.
| Parameters | |
|---|---|
Exception codecError |
The error. |
onCodecInitialized
protected void onCodecInitialized(
String name,
MediaCodecAdapter.Configuration configuration,
long initializedTimestampMs,
long initializationDurationMs
)
Called when a MediaCodec has been created and configured.
The default implementation is a no-op.
| Parameters | |
|---|---|
String name |
The name of the codec that was initialized. |
MediaCodecAdapter.Configuration configuration |
The |
long initializedTimestampMs |
|
long initializationDurationMs |
The time taken to initialize the codec in milliseconds. |
onCodecParametersChanged
protected abstract void onCodecParametersChanged(CodecParameters codecParameters)
Called when one or more of the subscribed codec parameters have changed.
| Parameters | |
|---|---|
CodecParameters codecParameters |
A |
onCodecReleased
protected void onCodecReleased(String name)
Called when a MediaCodec has been released.
The default implementation is a no-op.
| Parameters | |
|---|---|
String name |
The name of the codec that was released. |
onDisabled
protected void onDisabled()
Called when the renderer is disabled.
The default implementation is a no-op.
onEnabled
protected void onEnabled(boolean joining, boolean mayRenderStartOfStream)
Called when the renderer is enabled.
The default implementation is a no-op.
| Parameters | |
|---|---|
boolean joining |
Whether this renderer is being enabled to join an ongoing playback. |
boolean mayRenderStartOfStream |
Whether this renderer is allowed to render the start of the stream even if the state is not |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
If an error occurs. |
onInputFormatChanged
@CallSuper
protected @Nullable DecoderReuseEvaluation onInputFormatChanged(FormatHolder formatHolder)
Called when a new Format is read from the upstream MediaPeriod.
| Parameters | |
|---|---|
FormatHolder formatHolder |
A |
| Returns | |
|---|---|
@Nullable DecoderReuseEvaluation |
The result of the evaluation to determine whether the existing decoder instance can be reused for the new format, or |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
If an error occurs re-initializing the |
onOutputFormatChanged
protected void onOutputFormatChanged(Format format, @Nullable MediaFormat mediaFormat)
Called when one of the output formats changes.
The default implementation is a no-op.
| Parameters | |
|---|---|
Format format |
The input |
@Nullable MediaFormat mediaFormat |
The codec output |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
Thrown if an error occurs configuring the output. |
onOutputStreamOffsetUsChanged
protected void onOutputStreamOffsetUsChanged(long outputStreamOffsetUs)
Called after the output stream offset changes.
The default implementation is a no-op.
| Parameters | |
|---|---|
long outputStreamOffsetUs |
The output stream offset in microseconds. |
onPositionReset
protected void onPositionReset(
long positionUs,
boolean joining,
boolean sampleStreamIsResetToKeyFrame
)
Called when the position is reset. This occurs when the renderer is enabled after onStreamChanged 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 if sampleStreamIsResetToKeyFrame is true.
sampleStreamIsResetToKeyFrame is guaranteed to be true unless the implementation overrides supportsResetPositionWithoutKeyFrameReset to return
true.
The default implementation is a no-op.
| Parameters | |
|---|---|
long positionUs |
The new playback position in microseconds. |
boolean joining |
Whether this renderer is being enabled to join an ongoing playback. |
boolean sampleStreamIsResetToKeyFrame |
Whether the renderer's |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
If an error occurs. |
onProcessedOutputBuffer
@CallSuper
protected void onProcessedOutputBuffer(long presentationTimeUs)
Called when an output buffer is successfully processed.
| Parameters | |
|---|---|
long presentationTimeUs |
The timestamp associated with the output buffer. |
onProcessedStreamChange
protected void onProcessedStreamChange()
Called after the last output buffer before a stream change has been processed.
onQueueInputBuffer
protected void onQueueInputBuffer(DecoderInputBuffer buffer)
Called immediately before an input buffer is queued into the codec.
The default implementation is a no-op.
| Parameters | |
|---|---|
DecoderInputBuffer buffer |
The buffer to be queued. |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
Thrown if an error occurs handling the input buffer. |
onReset
protected void onReset()
Called when the renderer is reset.
The default implementation is a no-op.
onStarted
protected void onStarted()
Called when the renderer is started.
The default implementation is a no-op.
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
If an error occurs. |
onStopped
protected void onStopped()
Called when the renderer is stopped.
The default implementation is a no-op.
onStreamChanged
protected void onStreamChanged(
Format[] formats,
long startPositionUs,
long offsetUs,
MediaSource.MediaPeriodId mediaPeriodId
)
Called when the renderer's stream has changed. This occurs when the renderer is enabled after onEnabled 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 | |
|---|---|
Format[] formats |
The enabled formats. |
long startPositionUs |
The start position of the new stream in renderer time (microseconds). |
long offsetUs |
The offset that will be added to the timestamps of buffers read via |
MediaSource.MediaPeriodId mediaPeriodId |
The |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
If an error occurs. |
processOutputBuffer
protected abstract boolean processOutputBuffer(
long positionUs,
long elapsedRealtimeUs,
@Nullable MediaCodecAdapter codec,
@Nullable ByteBuffer buffer,
int bufferIndex,
int bufferFlags,
int sampleCount,
long bufferPresentationTimeUs,
boolean isDecodeOnlyBuffer,
boolean isLastBuffer,
Format format
)
Processes an output media buffer.
When a new ByteBuffer is passed to this method its position and limit delineate the data to be processed. The return value indicates whether the buffer was processed in full. If true is returned then the next call to this method will receive a new buffer to be processed. If false is returned then the same buffer will be passed to the next call. An implementation of this method is free to modify the buffer and can assume that the buffer will not be externally modified between successive calls. Hence an implementation can, for example, modify the buffer's position to keep track of how much of the data it has processed.
Note that the first call to this method following a call to onPositionReset will always receive a new ByteBuffer to be processed.
| Parameters | |
|---|---|
long positionUs |
The current media time in microseconds, measured at the start of the current iteration of the rendering loop. |
long elapsedRealtimeUs |
|
@Nullable MediaCodecAdapter codec |
The |
@Nullable ByteBuffer buffer |
The output buffer to process, or null if the buffer data is not made available to the application layer (see |
int bufferIndex |
The index of the output buffer. |
int bufferFlags |
The flags attached to the output buffer. |
int sampleCount |
The number of samples extracted from the sample queue in the buffer. This allows handling multiple samples as a batch for efficiency. |
long bufferPresentationTimeUs |
The presentation time of the output buffer in microseconds. |
boolean isDecodeOnlyBuffer |
Whether the buffer timestamp is less than the intended playback start position. |
boolean isLastBuffer |
Whether the buffer is known to contain the last sample of the current stream. This flag is set on a best effort basis, and any logic relying on it should degrade gracefully to handle cases where it's not set. |
Format format |
The |
| Returns | |
|---|---|
boolean |
Whether the output buffer was fully processed (for example, rendered or skipped). |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
If an error occurs processing the output buffer. |
renderToEndOfStream
protected void renderToEndOfStream()
Incrementally renders any remaining output.
The default implementation is a no-op.
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
Thrown if an error occurs rendering remaining output. |
resetCodecStateForFlush
@CallSuper
protected void resetCodecStateForFlush()
Resets the renderer internal state after a codec flush.
resetCodecStateForRelease
@CallSuper
protected void resetCodecStateForRelease()
Resets the renderer internal state after a codec release.
Note that this only needs to reset state variables that are changed in addition to those already changed in resetCodecStateForFlush.
setPendingOutputEndOfStream
protected final void setPendingOutputEndOfStream()
Notifies the renderer that output end of stream is pending and should be handled on the next render.
setPendingPlaybackException
protected final void setPendingPlaybackException(ExoPlaybackException exception)
Sets an exception to be re-thrown by render.
| Parameters | |
|---|---|
ExoPlaybackException exception |
The exception. |
shouldDiscardDecoderInputBuffer
protected boolean shouldDiscardDecoderInputBuffer(DecoderInputBuffer buffer)
Returns whether the input buffer should be discarded before decoding.
Implement this method to to skip decoding of buffers that are not needed during a seek, or to drop input buffers that cannot be rendered on time. See BUFFER_FLAG_NOT_DEPENDED_ON.
Subclasses that implement this method are responsible for updating decoderCounters. For codecs with out-of-order buffers, consecutive dropped input buffers may have to be counted after frame reordering. For example, in processOutputBuffer.
Implementations of this method must update the decoder input buffer contents. Data that is only used for output at the current timeUs should be removed. Data that is referenced by later input buffers should remain in the current buffer.
| Parameters | |
|---|---|
DecoderInputBuffer buffer |
The input buffer. |
shouldFlushCodec
protected boolean shouldFlushCodec()
Returns whether the codec should be flushed in cases such that the codec was not released.
Default is true.
| See also | |
|---|---|
flushOrReleaseCodec |
shouldReinitCodec
protected boolean shouldReinitCodec()
Returns whether the renderer needs to re-initialize the codec, possibly as a result of a change in device capabilities.
shouldReleaseCodecInsteadOfFlushing
protected boolean shouldReleaseCodecInsteadOfFlushing()
Returns whether the codec should be released rather than flushed.
| See also | |
|---|---|
flushOrReleaseCodec |
shouldSkipDecoderInputBuffer
protected boolean shouldSkipDecoderInputBuffer(DecoderInputBuffer buffer)
Returns whether the input buffer should be skipped before the decoder.
This can be used to skip decoding of buffers that are not depended on during seeking. See BUFFER_FLAG_NOT_DEPENDED_ON.
| Parameters | |
|---|---|
DecoderInputBuffer buffer |
The input buffer. |
shouldUseBypass
protected boolean shouldUseBypass(Format format)
Returns whether buffers in the input format can be processed without a codec.
This method is only called if the content is not DRM protected, because if the content is DRM protected use of bypass is never possible.
| Returns | |
|---|---|
boolean |
Whether playback bypassing |
supportsFormat
@RendererCapabilities.Capabilities
protected abstract int supportsFormat(MediaCodecSelector mediaCodecSelector, Format format)
Returns the Capabilities for the given Format.
| Parameters | |
|---|---|
MediaCodecSelector mediaCodecSelector |
The decoder selector. |
Format format |
The |
| Returns | |
|---|---|
int |
The |
| Throws | |
|---|---|
androidx.media3.exoplayer.mediacodec.MediaCodecUtil.DecoderQueryException |
If there was an error querying decoders. |
supportsFormatDrm
protected static boolean supportsFormatDrm(Format format)
Returns whether this renderer supports the given Format's DRM scheme.
updateCodecOperatingRate
protected final boolean updateCodecOperatingRate()
Updates the codec operating rate, or triggers codec release and re-initialization if a previously set operating rate needs to be cleared.
| Returns | |
|---|---|
boolean |
False if codec release and re-initialization was triggered. True in all other cases. |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
If an error occurs releasing or initializing a codec. |
updateOutputFormatForTime
protected final void updateOutputFormatForTime(long presentationTimeUs)
Updates the output formats for the specified output buffer timestamp, calling onOutputFormatChanged if a change has occurred.
Subclasses should only call this method if operating in a mode where buffers are not dequeued from the decoder, for example when using video tunneling).
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
Thrown if an error occurs as a result of the output format change. |