Package com.google.android.exoplayer2

## Interface Renderer

- All Superinterfaces:
    `PlayerMessage.Target`
  All Known Implementing Classes:
    `BaseRenderer`, `CameraMotionRenderer`, `DecoderAudioRenderer`, `DecoderVideoRenderer`, `FakeAudioRenderer`, `FakeMediaClockRenderer`, `FakeRenderer`, `FakeVideoRenderer`, `FfmpegAudioRenderer`, `LibflacAudioRenderer`, `Libgav1VideoRenderer`, `LibopusAudioRenderer`, `LibvpxVideoRenderer`, `MediaCodecAudioRenderer`, `MediaCodecRenderer`, `MediaCodecVideoRenderer`, `MetadataRenderer`, `NoSampleRenderer`, `TextRenderer`

      public interface Renderer
      extends PlayerMessage.Target

  Renders media read from a `SampleStream`.

  Internally, a renderer's lifecycle is managed by the owning `ExoPlayer`. The renderer is transitioned through various states as the overall playback state and enabled tracks change. The valid state transitions are shown below, annotated with the methods that are called during each transition.

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Interface | Description
    --- | --- | ---
    `static interface` | `Renderer.State` | The renderer states.
    `static interface` | `Renderer.VideoScalingMode` | Deprecated. Use `C.VideoScalingMode`.
    `static interface` | `Renderer.WakeupListener` | Some renderers can signal when `render(long, long)` should be called.

  - ### Field Summary

    Fields
    Modifier and Type | Field | Description
    --- | --- | ---
    `static int` | `MSG_CUSTOM_BASE` | Applications or extensions may define custom `MSG_*` constants that can be passed to renderers.
    `static int` | `MSG_SET_AUDIO_ATTRIBUTES` | A type of a message that can be passed to an audio renderer via `ExoPlayer.createMessage(Target)`.
    `static int` | `MSG_SET_AUDIO_SESSION_ID` | The type of a message that can be passed to audio and video renderers via `ExoPlayer.createMessage(Target)`.
    `static int` | `MSG_SET_AUX_EFFECT_INFO` | A type of a message that can be passed to an audio renderer via `ExoPlayer.createMessage(Target)`.
    `static int` | `MSG_SET_CAMERA_MOTION_LISTENER` | The type of a message that can be passed to a camera motion renderer via `ExoPlayer.createMessage(Target)`.
    `static int` | `MSG_SET_SCALING_MODE` | The type of a message that can be passed to a `MediaCodec`-based video renderer via `ExoPlayer.createMessage(Target)`.
    `static int` | `MSG_SET_SKIP_SILENCE_ENABLED` | The type of a message that can be passed to an audio renderer via `ExoPlayer.createMessage(Target)`.
    `static int` | `MSG_SET_VIDEO_FRAME_METADATA_LISTENER` | The type of a message that can be passed to a video renderer via `ExoPlayer.createMessage(Target)`.
    `static int` | `MSG_SET_VIDEO_OUTPUT` | The type of a message that can be passed to a video renderer via `ExoPlayer.createMessage(Target)`.
    `static int` | `MSG_SET_VOLUME` | A type of a message that can be passed to an audio renderer via `ExoPlayer.createMessage(Target)`.
    `static int` | `MSG_SET_WAKEUP_LISTENER` | The type of a message that can be passed to a `Renderer` via `ExoPlayer.createMessage(Target)`, to inform the renderer that it can schedule waking up another component.
    `static int` | `STATE_DISABLED` | The renderer is disabled.
    `static int` | `STATE_ENABLED` | The renderer is enabled but not started.
    `static int` | `STATE_STARTED` | The renderer is started.
    `static int` | `VIDEO_SCALING_MODE_DEFAULT` | Deprecated. Use `C.VIDEO_SCALING_MODE_DEFAULT`.
    `static int` | `VIDEO_SCALING_MODE_SCALE_TO_FIT` | Deprecated. Use `C.VIDEO_SCALING_MODE_SCALE_TO_FIT`.
    `static int` | `VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING` | Deprecated. Use `C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING`.

  - ### Method Summary

    All Methods Instance Methods Abstract Methods Default Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `void` | `disable()` | Disable the renderer, transitioning it to the `STATE_DISABLED` state.
    `void` | `enable​(RendererConfiguration configuration, Format[] formats, SampleStream stream, long positionUs, boolean joining, boolean mayRenderStartOfStream, long startPositionUs, long offsetUs)` | Enables the renderer to consume from the specified `SampleStream`.
    `RendererCapabilities` | `getCapabilities()` | Returns the capabilities of the renderer.
    `MediaClock` | `getMediaClock()` | If the renderer advances its own playback position then this method returns a corresponding `MediaClock`.
    `String` | `getName()` | Returns the name of this renderer, for logging and debugging purposes.
    `long` | `getReadingPositionUs()` | Returns the renderer time up to which the renderer has read samples from the current `SampleStream`, in microseconds, or `C.TIME_END_OF_SOURCE` if the renderer has read the current `SampleStream` to the end.
    `int` | `getState()` | Returns the current state of the renderer.
    `SampleStream` | `getStream()` | Returns the `SampleStream` being consumed, or null if the renderer is disabled.
    `int` | `getTrackType()` | Returns the track type that the renderer handles.
    `boolean` | `hasReadStreamToEnd()` | Returns whether the renderer has read the current `SampleStream` to the end.
    `boolean` | `isCurrentStreamFinal()` | Returns whether the current `SampleStream` will be the final one supplied before the renderer is next disabled or reset.
    `boolean` | `isEnded()` | Whether the renderer is ready for the `ExoPlayer` instance to transition to `Player.STATE_ENDED`.
    `boolean` | `isReady()` | Whether the renderer is able to immediately render media from the current position.
    `void` | `maybeThrowStreamError()` | Throws an error that's preventing the renderer from reading from its `SampleStream`.
    `void` | `render​(long positionUs, long elapsedRealtimeUs)` | Incrementally renders the `SampleStream`.
    `void` | `replaceStream​(Format[] formats, SampleStream stream, long startPositionUs, long offsetUs)` | Replaces the `SampleStream` from which samples will be consumed.
    `void` | `reset()` | Forces the renderer to give up any resources (e.g.
    `void` | `resetPosition​(long positionUs)` | Signals to the renderer that a position discontinuity has occurred.
    `void` | `setCurrentStreamFinal()` | Signals to the renderer that the current `SampleStream` will be the final one supplied before it is next disabled or reset.
    `void` | `setIndex​(int index)` | Sets the index of this renderer within the player.
    `default void` | `setPlaybackSpeed​(float currentPlaybackSpeed, float targetPlaybackSpeed)` | Indicates the playback speed to this renderer.
    `void` | `start()` | Starts the renderer, meaning that calls to `render(long, long)` will cause media to be rendered.
    `void` | `stop()` | Stops the renderer, transitioning it to the `STATE_ENABLED` state.

    - ### Methods inherited from interface com.google.android.exoplayer2.PlayerMessage.Target

      `handleMessage`

- - ### Field Detail

    - #### MSG_SET_VIDEO_OUTPUT

          static final int MSG_SET_VIDEO_OUTPUT

      The type of a message that can be passed to a video renderer via `ExoPlayer.createMessage(Target)`. The message payload is normally a `Surface`, however some video renderers may accept other outputs (e.g., `VideoDecoderOutputBufferRenderer`).

      If the receiving renderer does not support the payload type as an output, then it will clear any existing output that it has.

      See Also:
        Constant Field Values

    - #### MSG_SET_VOLUME

          static final int MSG_SET_VOLUME

      A type of a message that can be passed to an audio renderer via `ExoPlayer.createMessage(Target)`. The message payload should be a `Float` with 0 being silence and 1 being unity gain.
      See Also:
        Constant Field Values

    - #### MSG_SET_AUDIO_ATTRIBUTES

          static final int MSG_SET_AUDIO_ATTRIBUTES

      A type of a message that can be passed to an audio renderer via `ExoPlayer.createMessage(Target)`. The message payload should be an `AudioAttributes` instance that will configure the underlying audio track. If not set, the default audio attributes will be used. They are suitable for general media playback.

      Setting the audio attributes during playback may introduce a short gap in audio output as the audio track is recreated. A new audio session id will also be generated.

      If tunneling is enabled by the track selector, the specified audio attributes will be ignored, but they will take effect if audio is later played without tunneling.

      If the device is running a build before platform API version 21, audio attributes cannot be set directly on the underlying audio track. In this case, the usage will be mapped onto an equivalent stream type using `Util.getStreamTypeForAudioUsage(int)`.

      To get audio attributes that are equivalent to a legacy stream type, pass the stream type to `Util.getAudioUsageForStreamType(int)` and use the returned `C.AudioUsage` to build an audio attributes instance.

      See Also:
        Constant Field Values

    - #### MSG_SET_SCALING_MODE

          static final int MSG_SET_SCALING_MODE

      The type of a message that can be passed to a `MediaCodec`-based video renderer via `ExoPlayer.createMessage(Target)`. The message payload should be one of the integer scaling modes in `C.VideoScalingMode`.

      Note that the scaling mode only applies if the `Surface` targeted by the renderer is owned by a `SurfaceView`.

      See Also:
        Constant Field Values

    - #### MSG_SET_AUX_EFFECT_INFO

          static final int MSG_SET_AUX_EFFECT_INFO

      A type of a message that can be passed to an audio renderer via `ExoPlayer.createMessage(Target)`. The message payload should be an `AuxEffectInfo` instance representing an auxiliary audio effect for the underlying audio track.
      See Also:
        Constant Field Values

    - #### MSG_SET_VIDEO_FRAME_METADATA_LISTENER

          static final int MSG_SET_VIDEO_FRAME_METADATA_LISTENER

      The type of a message that can be passed to a video renderer via `ExoPlayer.createMessage(Target)`. The message payload should be a `VideoFrameMetadataListener` instance, or null.
      See Also:
        Constant Field Values

    - #### MSG_SET_CAMERA_MOTION_LISTENER

          static final int MSG_SET_CAMERA_MOTION_LISTENER

      The type of a message that can be passed to a camera motion renderer via `ExoPlayer.createMessage(Target)`. The message payload should be a `CameraMotionListener` instance, or null.
      See Also:
        Constant Field Values

    - #### MSG_SET_SKIP_SILENCE_ENABLED

          static final int MSG_SET_SKIP_SILENCE_ENABLED

      The type of a message that can be passed to an audio renderer via `ExoPlayer.createMessage(Target)`. The message payload should be a `Boolean` instance telling whether to enable or disable skipping silences in the audio stream.
      See Also:
        Constant Field Values

    - #### MSG_SET_AUDIO_SESSION_ID

          static final int MSG_SET_AUDIO_SESSION_ID

      The type of a message that can be passed to audio and video renderers via `ExoPlayer.createMessage(Target)`. The message payload should be an `Integer` instance representing the audio session ID that will be attached to the underlying audio track. Video renderers that support tunneling will use the audio session ID when tunneling is enabled.
      See Also:
        Constant Field Values

    - #### MSG_SET_WAKEUP_LISTENER

          static final int MSG_SET_WAKEUP_LISTENER

      The type of a message that can be passed to a `Renderer` via `ExoPlayer.createMessage(Target)`, to inform the renderer that it can schedule waking up another component.

      The message payload must be a `Renderer.WakeupListener` instance.

      See Also:
        Constant Field Values

    - #### MSG_CUSTOM_BASE

          static final int MSG_CUSTOM_BASE

      Applications or extensions may define custom `MSG_*` constants that can be passed to renderers. These custom constants must be greater than or equal to this value.
      See Also:
        Constant Field Values

    - #### VIDEO_SCALING_MODE_SCALE_TO_FIT

          @Deprecated
          static final int VIDEO_SCALING_MODE_SCALE_TO_FIT

      Deprecated.
      Use `C.VIDEO_SCALING_MODE_SCALE_TO_FIT`.
      See Also:
        Constant Field Values

    - #### VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING

          @Deprecated
          static final int VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING

      Deprecated.
      Use `C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING`.
      See Also:
        Constant Field Values

    - #### VIDEO_SCALING_MODE_DEFAULT

          @Deprecated
          static final int VIDEO_SCALING_MODE_DEFAULT

      Deprecated.
      Use `C.VIDEO_SCALING_MODE_DEFAULT`.
      See Also:
        Constant Field Values

    - #### STATE_DISABLED

          static final int STATE_DISABLED

      The renderer is disabled. A renderer in this state will not proactively acquire resources that it requires for rendering (e.g., media decoders), but may continue to hold any that it already has. `reset()` can be called to force the renderer to release such resources.
      See Also:
        Constant Field Values

    - #### STATE_ENABLED

          static final int STATE_ENABLED

      The renderer is enabled but not started. A renderer in this state may render media at the current position (e.g. an initial video frame), but the position will not advance. A renderer in this state will typically hold resources that it requires for rendering (e.g. media decoders).
      See Also:
        Constant Field Values

    - #### STATE_STARTED

          static final int STATE_STARTED

      The renderer is started. Calls to `render(long, long)` will cause media to be rendered.
      See Also:
        Constant Field Values

  - ### Method Detail

    - #### getName

          String getName()

      Returns the name of this renderer, for logging and debugging purposes. Should typically be the renderer's (un-obfuscated) class name.
      Returns:
        The name of this renderer.

    - #### getTrackType

          int getTrackType()

      Returns the track type that the renderer handles.
      Returns:
        One of the `TRACK_TYPE_*` constants defined in `C`.
      See Also:
        `ExoPlayer.getRendererType(int)`

    - #### getCapabilities

          RendererCapabilities getCapabilities()

      Returns the capabilities of the renderer.
      Returns:
        The capabilities of the renderer.

    - #### setIndex

          void setIndex​(int index)

      Sets the index of this renderer within the player.
      Parameters:
        `index` - The renderer index.

    - #### getMediaClock

          @Nullable
          MediaClock getMediaClock()

      If the renderer advances its own playback position then this method returns a corresponding `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.
      Returns:
        The `MediaClock` tracking the playback position of the renderer, or null.

    - #### getState

          @State
          int getState()

      Returns the current state of the renderer.
      Returns:
        The current state. One of `STATE_DISABLED`, `STATE_ENABLED` and `STATE_STARTED`.

    - #### enable

          void enable​(RendererConfiguration configuration,
                      Format[] formats,
                      SampleStream stream,
                      long positionUs,
                      boolean joining,
                      boolean mayRenderStartOfStream,
                      long startPositionUs,
                      long offsetUs)
               throws ExoPlaybackException

      Enables the renderer to consume from the specified `SampleStream`.

      This method may be called when the renderer is in the following states: `STATE_DISABLED`.

      Parameters:
        `configuration` - The renderer configuration.
        `formats` - The enabled formats.
        `stream` - The `SampleStream` from which the renderer should consume.
        `positionUs` - The player's current position.
        `joining` - Whether this renderer is being enabled to join an ongoing playback.
        `mayRenderStartOfStream` - Whether this renderer is allowed to render the start of the stream even if the state is not `STATE_STARTED` yet.
        `startPositionUs` - The start position of the stream in renderer time (microseconds).
        `offsetUs` - The offset to be added to timestamps of buffers read from `stream` before they are rendered.
      Throws:
        `ExoPlaybackException` - If an error occurs.

    - #### start

          void start()
              throws ExoPlaybackException

      Starts the renderer, meaning that calls to `render(long, long)` will cause media to be rendered.

      This method may be called when the renderer is in the following states: `STATE_ENABLED`.

      Throws:
        `ExoPlaybackException` - If an error occurs.

    - #### replaceStream

          void replaceStream​(Format[] formats,
                             SampleStream stream,
                             long startPositionUs,
                             long offsetUs)
                      throws ExoPlaybackException

      Replaces the `SampleStream` from which samples will be consumed.

      This method may be called when the renderer is in the following states: `STATE_ENABLED`, `STATE_STARTED`.

      Parameters:
        `formats` - The enabled formats.
        `stream` - The `SampleStream` from which the renderer should consume.
        `startPositionUs` - The start position of the new stream in renderer time (microseconds).
        `offsetUs` - The offset to be added to timestamps of buffers read from `stream` before they are rendered.
      Throws:
        `ExoPlaybackException` - If an error occurs.

    - #### getStream

          @Nullable
          SampleStream getStream()

      Returns the `SampleStream` being consumed, or null if the renderer is disabled.

    - #### hasReadStreamToEnd

          boolean hasReadStreamToEnd()

      Returns whether the renderer has read the current `SampleStream` to the end.

      This method may be called when the renderer is in the following states: `STATE_ENABLED`, `STATE_STARTED`.

    - #### getReadingPositionUs

          long getReadingPositionUs()

      Returns the renderer time up to which the renderer has read samples from the current `SampleStream`, in microseconds, or `C.TIME_END_OF_SOURCE` if the renderer has read the current `SampleStream` to the end.

      This method may be called when the renderer is in the following states: `STATE_ENABLED`, `STATE_STARTED`.

    - #### setCurrentStreamFinal

          void setCurrentStreamFinal()

      Signals to the renderer that the current `SampleStream` will be the final one supplied before it is next disabled or reset.

      This method may be called when the renderer is in the following states: `STATE_ENABLED`, `STATE_STARTED`.

    - #### isCurrentStreamFinal

          boolean isCurrentStreamFinal()

      Returns whether the current `SampleStream` will be the final one supplied before the renderer is next disabled or reset.

    - #### maybeThrowStreamError

          void maybeThrowStreamError()
                              throws IOException

      Throws an error that's preventing the renderer from reading from its `SampleStream`. Does nothing if no such error exists.

      This method may be called when the renderer is in the following states: `STATE_ENABLED`, `STATE_STARTED`.

      Throws:
        `IOException` - An error that's preventing the renderer from making progress or buffering more data.

    - #### resetPosition

          void resetPosition​(long positionUs)
                      throws ExoPlaybackException

      Signals to the renderer that a position discontinuity has occurred.

      After a position discontinuity, the renderer's `SampleStream` is guaranteed to provide samples starting from a key frame.

      This method may be called when the renderer is in the following states: `STATE_ENABLED`, `STATE_STARTED`.

      Parameters:
        `positionUs` - The new playback position in microseconds.
      Throws:
        `ExoPlaybackException` - If an error occurs handling the reset.

    - #### setPlaybackSpeed

          default void setPlaybackSpeed​(float currentPlaybackSpeed,
                                        float targetPlaybackSpeed)
                                 throws ExoPlaybackException

      Indicates the playback speed to this renderer.

      The default implementation is a no-op.

      Parameters:
        `currentPlaybackSpeed` - The factor by which playback is currently sped up.
        `targetPlaybackSpeed` - The target factor by which playback should be sped up. This may be different from `currentPlaybackSpeed`, for example, if the speed is temporarily adjusted for live playback.
      Throws:
        `ExoPlaybackException` - If an error occurs handling the playback speed.

    - #### render

          void render​(long positionUs,
                      long elapsedRealtimeUs)
               throws ExoPlaybackException

      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(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)` 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:
        `positionUs` - The current media time in microseconds, measured at the start of the current iteration of the rendering loop.
        `elapsedRealtimeUs` - `SystemClock.elapsedRealtime()` in microseconds, measured at the start of the current iteration of the rendering loop.
      Throws:
        `ExoPlaybackException` - If an error occurs.

    - #### isReady

          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:
        Whether the renderer is ready to render media.

    - #### isEnded

          boolean isEnded()

      Whether the renderer is ready for the `ExoPlayer` instance to transition to `Player.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:
        Whether the renderer is ready for the player to transition to the ended state.

    - #### stop

          void stop()

      Stops the renderer, transitioning it to the `STATE_ENABLED` state.

      This method may be called when the renderer is in the following states: `STATE_STARTED`.

    - #### disable

          void disable()

      Disable the renderer, transitioning it to the `STATE_DISABLED` state.

      This method may be called when the renderer is in the following states: `STATE_ENABLED`.

    - #### reset

          void reset()

      Forces the renderer to give up any resources (e.g. media decoders) that it may be holding. If the renderer is not holding any resources, the call is a no-op.

      This method may be called when the renderer is in the following states: `STATE_DISABLED`.