MediaCodecVideoRenderer
@UnstableApi
public class MediaCodecVideoRenderer extends MediaCodecRenderer implements VideoFrameReleaseControl.FrameTimingEvaluator
| java.lang.Object | |||
| ↳ | androidx.media3.exoplayer.BaseRenderer | ||
| ↳ | androidx.media3.exoplayer.mediacodec.MediaCodecRenderer | ||
| ↳ | androidx.media3.exoplayer.video.MediaCodecVideoRenderer |
CapturingRenderersFactory.CapturingMediaCodecVideoRenderer |
A |
Decodes and renders video using MediaCodec.
This renderer accepts the following messages sent via createMessage on the playback thread:
- Message with type
MSG_SET_VIDEO_OUTPUTto set the output. The message payload should be the targetSurface, or null to clear the output. Other non-null payloads have the effect of clearing the output. - Message with type
MSG_SET_VIDEO_OUTPUT_RESOLUTIONto set the output resolution. The message payload should be the output resolution inSize. - Message with type
MSG_SET_SCALING_MODEto set the video scaling mode. The message payload should be one of the integer scaling modes inC.VideoScalingMode. Note that the scaling mode only applies if theSurfacetargeted by this renderer is owned by aandroid.view.SurfaceView. - Message with type
MSG_SET_CHANGE_FRAME_RATE_STRATEGYto set the strategy used to call setFrameRate. - Message with type
MSG_SET_VIDEO_FRAME_METADATA_LISTENERto set a listener for metadata associated with frames being rendered. The message payload should be theVideoFrameMetadataListener, or null. - Message with type
MSG_SET_AUDIO_SESSION_IDto set the audio session ID for tunneling. The message payload should be anInteger. - Message with type
MSG_SET_VIDEO_EFFECTSto set the video effects to apply. The message payload should be ajava.util.ListofEffectinstances. - Message with type
MSG_SET_PRIORITYto set the priority of the renderer. The message payload should be anInteger. - Message with type
MSG_TRANSFER_RESOURCESto transfer the video output surface to anotherMediaCodecVideoRendererinstance. The message payload should be the target renderer. - Message with type
MSG_SET_SCRUBBING_MODEto enable or disable scrubbing mode. The message payload should be aScrubbingModeParametersinstance, or null to disable. - Message with type
MSG_SET_CODEC_PARAMETERSto set a collection of codec parameters. The message payload should be aCodecParametersinstance. This is only supported on API level 29 and above. - Message with type
MSG_SET_SUBSCRIBED_CODEC_PARAMETER_KEYSto set the parameter keys that the renderer should monitor for changes. The message payload should be anImmutableSet<String>. This is only supported on API level 29 and above.
Summary
Nested types |
|---|
public final class MediaCodecVideoRenderer.BuilderA builder to create |
protected final class MediaCodecVideoRenderer.CodecMaxValues |
Public constructors |
|---|
This method is deprecated. Use |
This method is deprecated. Use |
This method is deprecated. Use |
This method is deprecated. Use |
This method is deprecated. Use |
This method is deprecated. Use |
This method is deprecated. Use |
Protected constructors |
|---|
Public methods |
|
|---|---|
void |
Enables this renderer to render the start of the stream even if the state is not |
static int |
getCodecMaxInputSize(MediaCodecInfo codecInfo, Format format)Returns a maximum input size for a given codec and format. |
String |
getName()Returns the name of this renderer, for logging and debugging purposes. |
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 |
Incrementally renders the |
void |
setPlaybackSpeed(float currentPlaybackSpeed, float targetPlaybackSpeed)Indicates the playback speed to this renderer. |
void |
setVideoEffects(List<Effect> effects)Sets the |
boolean |
shouldDropFrame(Returns whether the frame should be dropped. |
boolean |
shouldForceReleaseFrame(long earlyUs, long elapsedSinceLastReleaseUs)Whether a frame should be forced for release. |
boolean |
shouldIgnoreFrame(Returns whether this frame should be ignored. |
static int |
@RendererCapabilities.CapabilitiesReturns the |
boolean |
supportsResetPositionWithoutKeyFrameReset(long positionUs)Returns whether the renderer can support processing a position discontinuity without a key frame reset. |
Protected methods |
|
|---|---|
DecoderReuseEvaluation |
canReuseCodec(Evaluates whether the existing |
void |
changeVideoSinkInputStream(Called when ready to |
boolean |
Returns whether the codec is known to implement |
MediaCodecDecoderException |
createDecoderException( |
PlaybackVideoGraphWrapper |
createPlaybackVideoGraphWrapper(Creates a |
void |
@RequiresApi(value = 35) |
void |
dropOutputBuffer(Drops the output buffer with the specified index. |
void |
Experimental setter to ignore the checks for advancing timestamps before checking whether a late frame needs to be force released. |
long |
Returns the timestamp that is added to the buffer presentation time (the player decoding position) to get the frame presentation time, in microseconds. |
int |
Returns the flags that should be set on |
MediaCodecVideoRenderer.CodecMaxValues |
getCodecMaxValues(Returns |
float |
getCodecOperatingRateV23(Returns the |
List<MediaCodecInfo> |
getDecoderInfos(Returns a list of decoders that can decode media in the specified format, in priority order. |
static int |
getMaxInputSize(MediaCodecInfo codecInfo, Format format)Returns a maximum input buffer size for a given |
MediaCodecAdapter.Configuration |
getMediaCodecConfiguration(Returns the |
MediaFormat |
getMediaFormat(Returns the framework |
@Nullable Surface |
Returns the output surface. |
void |
@TargetApi(value = 29)Handles supplemental data associated with an input buffer. |
boolean |
maybeDropBuffersToKeyframe(Drops frames from the current output buffer to the next keyframe at or before the playback position. |
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 |
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. |
void |
onInit()Called when the renderer is initialized. |
@Nullable DecoderReuseEvaluation |
onInputFormatChanged(FormatHolder formatHolder)Called when a new |
void |
onOutputFormatChanged(Format format, @Nullable MediaFormat mediaFormat)Called when one of the output formats 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 |
onProcessedTunneledBuffer(long presentationTimeUs)Called when a buffer was processed in tunneling mode. |
void |
Called immediately before an input buffer is queued into the codec. |
void |
Called when the renderer is released. |
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. |
void |
onTimelineChanged(Timeline timeline)Called when a new timeline is |
boolean |
processOutputBuffer(Processes an output media buffer. |
void |
This method is deprecated. Override |
void |
renderOutputBufferV21(Renders the output buffer with the specified index. |
void |
Incrementally renders any remaining output. |
void |
Resets the renderer internal state after a codec flush. |
void |
setOutputSurfaceV23(MediaCodecAdapter codec, Surface surface) |
boolean |
Returns whether the input buffer should be discarded before decoding. |
boolean |
shouldDropBuffersToKeyframe(Returns whether to drop all buffers from the buffer being processed to the keyframe at or after the current playback position, if possible. |
boolean |
shouldDropOutputBuffer(Returns whether the buffer being processed should be dropped. |
final boolean |
Returns whether the codec should be flushed in cases such that the codec was not released. |
boolean |
shouldForceRenderOutputBuffer(Returns whether to force rendering an output buffer. |
boolean |
shouldInitCodec(MediaCodecInfo codecInfo) |
final boolean |
Returns whether the codec should be released rather than flushed. |
boolean |
Returns whether to skip buffers that have an identical release time as the previous released buffer. |
boolean |
shouldUseDetachedSurface(MediaCodecInfo codecInfo) |
boolean |
shouldUsePlaceholderSurface(MediaCodecInfo codecInfo) |
void |
skipOutputBuffer(Skips the output buffer with the specified index. |
int |
@RendererCapabilities.CapabilitiesReturns the |
void |
updateDroppedBufferCounters(Updates local counters and |
void |
updateVideoFrameProcessingOffsetCounters(long processingOffsetUs)Updates local counters and |
Inherited Constants |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Inherited fields |
||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||||||||||||||||||||||||||
|
Inherited methods |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Public constructors
MediaCodecVideoRenderer
publicMediaCodecVideoRenderer(
Context context,
MediaCodecSelector mediaCodecSelector
)
MediaCodecVideoRenderer
publicMediaCodecVideoRenderer(
Context context,
MediaCodecSelector mediaCodecSelector,
long allowedJoiningTimeMs
)
MediaCodecVideoRenderer
publicMediaCodecVideoRenderer(
Context context,
MediaCodecSelector mediaCodecSelector,
long allowedJoiningTimeMs,
@Nullable Handler eventHandler,
@Nullable VideoRendererEventListener eventListener,
int maxDroppedFramesToNotify
)
MediaCodecVideoRenderer
publicMediaCodecVideoRenderer(
Context context,
MediaCodecSelector mediaCodecSelector,
long allowedJoiningTimeMs,
boolean enableDecoderFallback,
@Nullable Handler eventHandler,
@Nullable VideoRendererEventListener eventListener,
int maxDroppedFramesToNotify
)
MediaCodecVideoRenderer
publicMediaCodecVideoRenderer(
Context context,
MediaCodecAdapter.Factory codecAdapterFactory,
MediaCodecSelector mediaCodecSelector,
long allowedJoiningTimeMs,
boolean enableDecoderFallback,
@Nullable Handler eventHandler,
@Nullable VideoRendererEventListener eventListener,
int maxDroppedFramesToNotify
)
MediaCodecVideoRenderer
publicMediaCodecVideoRenderer(
Context context,
MediaCodecAdapter.Factory codecAdapterFactory,
MediaCodecSelector mediaCodecSelector,
long allowedJoiningTimeMs,
boolean enableDecoderFallback,
@Nullable Handler eventHandler,
@Nullable VideoRendererEventListener eventListener,
int maxDroppedFramesToNotify,
float assumedMinimumCodecOperatingRate
)
MediaCodecVideoRenderer
publicMediaCodecVideoRenderer(
Context context,
MediaCodecAdapter.Factory codecAdapterFactory,
MediaCodecSelector mediaCodecSelector,
long allowedJoiningTimeMs,
boolean enableDecoderFallback,
@Nullable Handler eventHandler,
@Nullable VideoRendererEventListener eventListener,
int maxDroppedFramesToNotify,
float assumedMinimumCodecOperatingRate,
@Nullable VideoSink videoSink
)
Protected constructors
MediaCodecVideoRenderer
protected MediaCodecVideoRenderer(MediaCodecVideoRenderer.Builder builder)
| Parameters | |
|---|---|
MediaCodecVideoRenderer.Builder builder |
The |
Public methods
enableMayRenderStartOfStream
public void enableMayRenderStartOfStream()
Enables this renderer to render the start of the stream even if the state is not STATE_STARTED yet.
This is used to update the value of mayRenderStartOfStream passed to enable.
getCodecMaxInputSize
public static int getCodecMaxInputSize(MediaCodecInfo codecInfo, Format format)
Returns a maximum input size for a given codec and format.
| Parameters | |
|---|---|
MediaCodecInfo codecInfo |
Information about the |
Format format |
The format. |
| Returns | |
|---|---|
int |
A maximum input size in bytes, or |
getName
public String getName()
Returns the name of this renderer, for logging and debugging purposes. Should typically be the renderer's (un-obfuscated) class name.
| Returns | |
|---|---|
String |
The name of this renderer. |
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
@CallSuper
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. |
shouldDropFrame
public boolean shouldDropFrame(
long earlyUs,
long elapsedRealtimeUs,
boolean isLastFrame
)
Returns whether the frame should be dropped.
| Parameters | |
|---|---|
long earlyUs |
The time until the buffer should be presented in microseconds. A negative value indicates that the buffer is late. |
long elapsedRealtimeUs |
|
boolean isLastFrame |
Whether the buffer is the last buffer in the current stream. |
shouldForceReleaseFrame
public boolean shouldForceReleaseFrame(long earlyUs, long elapsedSinceLastReleaseUs)
Whether a frame should be forced for release.
| Parameters | |
|---|---|
long earlyUs |
The time until the buffer should be presented in microseconds. A negative value indicates that the buffer is late. |
long elapsedSinceLastReleaseUs |
The elapsed time since the last frame was released, in microseconds. |
| Returns | |
|---|---|
boolean |
Whether the video frame should be force released. |
shouldIgnoreFrame
public boolean shouldIgnoreFrame(
long earlyUs,
long positionUs,
long elapsedRealtimeUs,
boolean isLastFrame,
boolean treatDroppedBuffersAsSkipped
)
Returns whether this frame should be ignored.
| Parameters | |
|---|---|
long earlyUs |
The time until the buffer should be presented in microseconds. A negative value indicates that the buffer is late. |
long positionUs |
The playback position, in microseconds. |
long elapsedRealtimeUs |
|
boolean isLastFrame |
Whether the buffer is the last buffer in the current stream. |
boolean treatDroppedBuffersAsSkipped |
Whether dropped buffers should be treated as intentionally skipped. |
| Returns | |
|---|---|
boolean |
Whether this frame should be ignored. |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
If an error occurs. |
supportsFormat
@RendererCapabilities.Capabilities
public static int supportsFormat(
Context context,
MediaCodecSelector mediaCodecSelector,
Format format
)
Returns the Capabilities of MediaCodecVideoRenderer for a given Format.
| Parameters | |
|---|---|
Context context |
A context. |
MediaCodecSelector mediaCodecSelector |
The decoder selector. |
Format format |
The |
| Returns | |
|---|---|
int |
The |
| Throws | |
|---|---|
androidx.media3.exoplayer.mediacodec.MediaCodecUtil.DecoderQueryException |
Thrown if there was an error querying decoders. |
supportsResetPositionWithoutKeyFrameReset
public boolean supportsResetPositionWithoutKeyFrameReset(long positionUs)
Returns whether the renderer can support processing a position discontinuity without a key frame reset.
| Parameters | |
|---|---|
long positionUs |
The new playback position in microseconds. |
| Returns | |
|---|---|
boolean |
Whether the renderer can support processing a position discontinuity without a key frame reset. |
Protected methods
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. |
changeVideoSinkInputStream
protected void changeVideoSinkInputStream(
VideoSink videoSink,
@VideoSink.InputType int inputType,
Format format,
@VideoSink.FirstFrameReleaseInstruction int firstFrameReleaseInstruction
)
Called when ready to change the input stream.
The default implementation applies this renderer's video effects.
codecNeedsSetOutputSurfaceWorkaround
protected boolean codecNeedsSetOutputSurfaceWorkaround(String name)
Returns whether the codec is known to implement setOutputSurface incorrectly.
If true is returned then we fall back to releasing and re-instantiating the codec instead.
| Parameters | |
|---|---|
String name |
The name of the codec. |
| Returns | |
|---|---|
boolean |
True if the device is known to implement |
createDecoderException
protected MediaCodecDecoderException createDecoderException(
Throwable cause,
@Nullable MediaCodecInfo codecInfo
)
createPlaybackVideoGraphWrapper
protected PlaybackVideoGraphWrapper createPlaybackVideoGraphWrapper(
Context context,
VideoFrameReleaseControl videoFrameReleaseControl
)
Creates a PlaybackVideoGraphWrapper instance.
detachOutputSurfaceV35
@RequiresApi(value = 35)
protected void detachOutputSurfaceV35(MediaCodecAdapter codec)
dropOutputBuffer
protected void dropOutputBuffer(
MediaCodecAdapter codec,
int index,
long presentationTimeUs
)
Drops the output buffer with the specified index.
| Parameters | |
|---|---|
MediaCodecAdapter codec |
The codec that owns the output buffer. |
int index |
The index of the output buffer to drop. |
long presentationTimeUs |
The presentation time of the output buffer, in microseconds. |
experimentalDisableAdvancingTimestampChecksInVideoFrameReleaseControl
protected void experimentalDisableAdvancingTimestampChecksInVideoFrameReleaseControl()
Experimental setter to ignore the checks for advancing timestamps before checking whether a late frame needs to be force released.
getBufferTimestampAdjustmentUs
protected long getBufferTimestampAdjustmentUs()
Returns the timestamp that is added to the buffer presentation time (the player decoding position) to get the frame presentation time, in microseconds.
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 |
getCodecMaxValues
protected MediaCodecVideoRenderer.CodecMaxValues getCodecMaxValues(
MediaCodecInfo codecInfo,
Format format,
Format[] streamFormats
)
Returns CodecMaxValues suitable for configuring a codec for format in a way that will allow possible adaptation to other compatible formats in streamFormats.
| Parameters | |
|---|---|
MediaCodecInfo codecInfo |
Information about the |
Format format |
The |
Format[] streamFormats |
The possible stream formats. |
| Returns | |
|---|---|
MediaCodecVideoRenderer.CodecMaxValues |
Suitable |
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 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. |
getMaxInputSize
protected static int getMaxInputSize(MediaCodecInfo codecInfo, Format format)
Returns a maximum input buffer size for a given MediaCodec and Format.
| Parameters | |
|---|---|
MediaCodecInfo codecInfo |
Information about the |
Format format |
The format. |
| Returns | |
|---|---|
int |
A maximum input buffer size in bytes, or |
getMediaCodecConfiguration
protected 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. |
getMediaFormat
protected MediaFormat getMediaFormat(
Format format,
String codecMimeType,
MediaCodecVideoRenderer.CodecMaxValues codecMaxValues,
float codecOperatingRate,
boolean deviceNeedsNoPostProcessWorkaround,
int tunnelingAudioSessionId
)
Returns the framework MediaFormat that should be used to configure the decoder.
| Parameters | |
|---|---|
Format format |
The |
String codecMimeType |
The MIME type handled by the codec. |
MediaCodecVideoRenderer.CodecMaxValues codecMaxValues |
Codec max values that should be used when configuring the decoder. |
float codecOperatingRate |
The codec operating rate, or |
boolean deviceNeedsNoPostProcessWorkaround |
Whether the device is known to do post processing by default that isn't compatible with ExoPlayer. |
int tunnelingAudioSessionId |
The audio session id to use for tunneling, or |
| Returns | |
|---|---|
MediaFormat |
The framework |
handleInputBufferSupplementalData
@TargetApi(value = 29)
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. |
maybeDropBuffersToKeyframe
protected boolean maybeDropBuffersToKeyframe(
long positionUs,
boolean treatDroppedBuffersAsSkipped
)
Drops frames from the current output buffer to the next keyframe at or before the playback position. If no such keyframe exists, as the playback position is inside the same group of pictures as the buffer being processed, returns false. Returns true otherwise.
| Parameters | |
|---|---|
long positionUs |
The current playback position, in microseconds. |
boolean treatDroppedBuffersAsSkipped |
Whether dropped buffers should be treated as intentionally skipped. |
| Returns | |
|---|---|
boolean |
Whether any buffers were dropped. |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
If an error occurs flushing the codec. |
maybeInitializeProcessingPipeline
@CallSuper
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 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
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. |
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.
onProcessedTunneledBuffer
protected void onProcessedTunneledBuffer(long presentationTimeUs)
Called when a buffer was processed in tunneling mode.
onQueueInputBuffer
@CallSuper
protected void onQueueInputBuffer(DecoderInputBuffer buffer)
Called immediately before an input buffer is queued into the codec.
| Parameters | |
|---|---|
DecoderInputBuffer buffer |
The buffer to be queued. |
| Throws | |
|---|---|
androidx.media3.exoplayer.ExoPlaybackException |
Thrown if an error occurs handling the input buffer. |
onRelease
protected void onRelease()
Called when the renderer is released.
The default implementation is a no-op.
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. |
onTimelineChanged
protected void onTimelineChanged(Timeline timeline)
Called when a new timeline is set.
The default implementation is a no-op.
| Parameters | |
|---|---|
Timeline timeline |
The new timeline, which can also be obtained from |
processOutputBuffer
protected 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. |
renderOutputBuffer
protected voidrenderOutputBuffer(
MediaCodecAdapter codec,
int index,
long presentationTimeUs
)
renderOutputBufferV21
protected void renderOutputBufferV21(
MediaCodecAdapter codec,
int index,
long presentationTimeUs,
long releaseTimeNs
)
Renders the output buffer with the specified index.
| Parameters | |
|---|---|
MediaCodecAdapter codec |
The codec that owns the output buffer. |
int index |
The index of the output buffer to drop. |
long presentationTimeUs |
The presentation time of the output buffer, in microseconds. |
long releaseTimeNs |
The wallclock time at which the frame should be displayed, in nanoseconds. |
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.
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. |
shouldDropBuffersToKeyframe
protected boolean shouldDropBuffersToKeyframe(
long earlyUs,
long elapsedRealtimeUs,
boolean isLastBuffer
)
Returns whether to drop all buffers from the buffer being processed to the keyframe at or after the current playback position, if possible.
| Parameters | |
|---|---|
long earlyUs |
The time until the current buffer should be presented in microseconds. A negative value indicates that the buffer is late. |
long elapsedRealtimeUs |
|
boolean isLastBuffer |
Whether the buffer is the last buffer in the current stream. |
shouldDropOutputBuffer
protected boolean shouldDropOutputBuffer(
long earlyUs,
long elapsedRealtimeUs,
boolean isLastBuffer
)
Returns whether the buffer being processed should be dropped.
| Parameters | |
|---|---|
long earlyUs |
The time until the buffer should be presented in microseconds. A negative value indicates that the buffer is late. |
long elapsedRealtimeUs |
|
boolean isLastBuffer |
Whether the buffer is the last buffer in the current stream. |
shouldFlushCodec
protected final boolean shouldFlushCodec()
Returns whether the codec should be flushed in cases such that the codec was not released.
Default is true.
| See also | |
|---|---|
flushOrReleaseCodec |
shouldForceRenderOutputBuffer
protected boolean shouldForceRenderOutputBuffer(
long earlyUs,
long elapsedSinceLastRenderUs
)
Returns whether to force rendering an output buffer.
| Parameters | |
|---|---|
long earlyUs |
The time until the current buffer should be presented in microseconds. A negative value indicates that the buffer is late. |
long elapsedSinceLastRenderUs |
The elapsed time since the last output buffer was rendered, in microseconds. |
| Returns | |
|---|---|
boolean |
Returns whether to force rendering an output buffer. |
shouldReleaseCodecInsteadOfFlushing
protected final boolean shouldReleaseCodecInsteadOfFlushing()
Returns whether the codec should be released rather than flushed.
| See also | |
|---|---|
flushOrReleaseCodec |
shouldSkipBuffersWithIdenticalReleaseTime
protected boolean shouldSkipBuffersWithIdenticalReleaseTime()
Returns whether to skip buffers that have an identical release time as the previous released buffer.
skipOutputBuffer
protected void skipOutputBuffer(
MediaCodecAdapter codec,
int index,
long presentationTimeUs
)
Skips the output buffer with the specified index.
| Parameters | |
|---|---|
MediaCodecAdapter codec |
The codec that owns the output buffer. |
int index |
The index of the output buffer to skip. |
long presentationTimeUs |
The presentation time of the output buffer, in microseconds. |
supportsFormat
@RendererCapabilities.Capabilities
protected 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. |
updateDroppedBufferCounters
protected void updateDroppedBufferCounters(
int droppedInputBufferCount,
int droppedDecoderBufferCount
)
Updates local counters and decoderCounters to reflect that buffers were dropped.
| Parameters | |
|---|---|
int droppedInputBufferCount |
The number of buffers dropped from the source before being passed to the decoder. |
int droppedDecoderBufferCount |
The number of buffers dropped after being passed to the decoder. |
updateVideoFrameProcessingOffsetCounters
protected void updateVideoFrameProcessingOffsetCounters(long processingOffsetUs)
Updates local counters and DecoderCounters with a new video frame processing offset.
| Parameters | |
|---|---|
long processingOffsetUs |
The video frame processing offset. |