public interface

RendererCapabilities

 androidx.media3.exoplayer.RendererCapabilities

Subclasses:

BaseRenderer, NoSampleRenderer, MetadataRenderer, MediaCodecAudioRenderer, DecoderAudioRenderer<T>, ImageRenderer, TextRenderer, MediaCodecVideoRenderer, DecoderVideoRenderer, CameraMotionRenderer, MediaCodecRenderer, FakeVideoRenderer, FakeMediaClockRenderer, FakeRenderer, FakeAudioRenderer, MidiRenderer

Gradle dependencies

compile group: 'androidx.media3', name: 'media3-exoplayer', version: '1.5.0-alpha01'

  • groupId: androidx.media3
  • artifactId: media3-exoplayer
  • version: 1.5.0-alpha01

Artifact androidx.media3:media3-exoplayer:1.5.0-alpha01 it located at Google repository (https://maven.google.com/)

Overview

Defines the capabilities of a Renderer.

Summary

Fields
public static final intADAPTIVE_NOT_SEAMLESS

The Renderer can adapt between formats, but may suffer a brief discontinuity (~50-100ms) when adaptation occurs.

public static final intADAPTIVE_NOT_SUPPORTED

The Renderer does not support adaptation between formats.

public static final intADAPTIVE_SEAMLESS

The Renderer can seamlessly adapt between formats.

public static final intADAPTIVE_SUPPORT_MASK

A mask to apply to RendererCapabilities.Capabilities to obtain the RendererCapabilities.AdaptiveSupport only.

public static final intAUDIO_OFFLOAD_GAPLESS_SUPPORTED

The renderer supports audio offload and gapless transitions with this format.

public static final intAUDIO_OFFLOAD_NOT_SUPPORTED

Audio offload is not supported with this format.

public static final intAUDIO_OFFLOAD_SPEED_CHANGE_SUPPORTED

The renderer supports audio offload and speed changes with this format.

public static final intAUDIO_OFFLOAD_SUPPORT_MASK

A mask to apply to RendererCapabilities.Capabilities to obtain RendererCapabilities.AudioOffloadSupport only.

public static final intAUDIO_OFFLOAD_SUPPORTED

The renderer supports audio offload with this format.

public static final intDECODER_SUPPORT_FALLBACK

The format exceeds the primary decoder's capabilities but is supported by fallback decoder

public static final intDECODER_SUPPORT_FALLBACK_MIMETYPE

The format's MIME type is unsupported and the renderer may use a decoder for a fallback MIME type.

public static final intDECODER_SUPPORT_MASK

A mask to apply to RendererCapabilities.Capabilities to obtain RendererCapabilities.DecoderSupport only.

public static final intDECODER_SUPPORT_PRIMARY

The renderer is able to use the primary decoder for the format's MIME type.

public static final intFORMAT_SUPPORT_MASK

A mask to apply to RendererCapabilities.Capabilities to obtain the only.

public static final intHARDWARE_ACCELERATION_NOT_SUPPORTED

The renderer is not able to use hardware acceleration.

public static final intHARDWARE_ACCELERATION_SUPPORT_MASK

A mask to apply to RendererCapabilities.Capabilities to obtain RendererCapabilities.HardwareAccelerationSupport only.

public static final intHARDWARE_ACCELERATION_SUPPORTED

The renderer is able to use hardware acceleration.

public static final intTUNNELING_NOT_SUPPORTED

The Renderer does not support tunneled output.

public static final intTUNNELING_SUPPORT_MASK

A mask to apply to RendererCapabilities.Capabilities to obtain RendererCapabilities.TunnelingSupport only.

public static final intTUNNELING_SUPPORTED

The Renderer supports tunneled output.

Methods
public voidclearListener()

Clears the RendererCapabilities.Listener.

public static intcreate(int formatSupport)

Returns RendererCapabilities.Capabilities for the given .

public static intcreate(int formatSupport, int adaptiveSupport, int tunnelingSupport)

Returns RendererCapabilities.Capabilities combining the given , RendererCapabilities.AdaptiveSupport and RendererCapabilities.TunnelingSupport.

public static intcreate(int formatSupport, int adaptiveSupport, int tunnelingSupport, int audioOffloadSupport)

Returns RendererCapabilities.Capabilities combining the given , RendererCapabilities.AdaptiveSupport, RendererCapabilities.TunnelingSupport, and RendererCapabilities.AudioOffloadSupport.

public static intcreate(int formatSupport, int adaptiveSupport, int tunnelingSupport, int hardwareAccelerationSupport, int decoderSupport)

Returns RendererCapabilities.Capabilities combining the given , RendererCapabilities.AdaptiveSupport, RendererCapabilities.TunnelingSupport, RendererCapabilities.HardwareAccelerationSupport, and RendererCapabilities.DecoderSupport.

public static intcreate(int formatSupport, int adaptiveSupport, int tunnelingSupport, int hardwareAccelerationSupport, int decoderSupport, int audioOffloadSupport)

Returns RendererCapabilities.Capabilities combining the given , RendererCapabilities.AdaptiveSupport, RendererCapabilities.TunnelingSupport, RendererCapabilities.HardwareAccelerationSupport, RendererCapabilities.DecoderSupport and RendererCapabilities.AudioOffloadSupport.

public static intgetAdaptiveSupport(int supportFlags)

Returns the RendererCapabilities.AdaptiveSupport from the combined RendererCapabilities.Capabilities.

public static intgetAudioOffloadSupport(int supportFlags)

Returns the RendererCapabilities.AudioOffloadSupport from the combined RendererCapabilities.Capabilities.

public static intgetDecoderSupport(int supportFlags)

Returns the RendererCapabilities.DecoderSupport from the combined RendererCapabilities.Capabilities.

public static intgetFormatSupport(int supportFlags)

Returns the from the combined RendererCapabilities.Capabilities.

public static intgetHardwareAccelerationSupport(int supportFlags)

Returns the RendererCapabilities.HardwareAccelerationSupport from the combined RendererCapabilities.Capabilities.

public java.lang.StringgetName()

Returns the name of the Renderer.

public intgetTrackType()

Returns the track type that the Renderer handles.

public static intgetTunnelingSupport(int supportFlags)

Returns the RendererCapabilities.TunnelingSupport from the combined RendererCapabilities.Capabilities.

public static booleanisFormatSupported(int supportFlags, boolean allowExceedsCapabilities)

Returns whether the from the combined RendererCapabilities.Capabilities indicates the format is supported.

public voidsetListener(RendererCapabilities.Listener listener)

Sets the RendererCapabilities.Listener.

public intsupportsFormat(Format format)

Returns the extent to which the Renderer supports a given format.

public intsupportsMixedMimeTypeAdaptation()

Returns the extent to which the Renderer supports adapting between supported formats that have different MIME types.

Fields

public static final int FORMAT_SUPPORT_MASK

A mask to apply to RendererCapabilities.Capabilities to obtain the only.

public static final int ADAPTIVE_SUPPORT_MASK

A mask to apply to RendererCapabilities.Capabilities to obtain the RendererCapabilities.AdaptiveSupport only.

public static final int ADAPTIVE_SEAMLESS

The Renderer can seamlessly adapt between formats.

public static final int ADAPTIVE_NOT_SEAMLESS

The Renderer can adapt between formats, but may suffer a brief discontinuity (~50-100ms) when adaptation occurs.

public static final int ADAPTIVE_NOT_SUPPORTED

The Renderer does not support adaptation between formats.

public static final int TUNNELING_SUPPORT_MASK

A mask to apply to RendererCapabilities.Capabilities to obtain RendererCapabilities.TunnelingSupport only.

public static final int TUNNELING_SUPPORTED

The Renderer supports tunneled output.

public static final int TUNNELING_NOT_SUPPORTED

The Renderer does not support tunneled output.

public static final int HARDWARE_ACCELERATION_SUPPORT_MASK

A mask to apply to RendererCapabilities.Capabilities to obtain RendererCapabilities.HardwareAccelerationSupport only.

public static final int HARDWARE_ACCELERATION_SUPPORTED

The renderer is able to use hardware acceleration.

public static final int HARDWARE_ACCELERATION_NOT_SUPPORTED

The renderer is not able to use hardware acceleration.

public static final int DECODER_SUPPORT_MASK

A mask to apply to RendererCapabilities.Capabilities to obtain RendererCapabilities.DecoderSupport only.

public static final int DECODER_SUPPORT_FALLBACK_MIMETYPE

The format's MIME type is unsupported and the renderer may use a decoder for a fallback MIME type.

public static final int DECODER_SUPPORT_PRIMARY

The renderer is able to use the primary decoder for the format's MIME type.

public static final int DECODER_SUPPORT_FALLBACK

The format exceeds the primary decoder's capabilities but is supported by fallback decoder

public static final int AUDIO_OFFLOAD_SUPPORT_MASK

A mask to apply to RendererCapabilities.Capabilities to obtain RendererCapabilities.AudioOffloadSupport only.

public static final int AUDIO_OFFLOAD_SPEED_CHANGE_SUPPORTED

The renderer supports audio offload and speed changes with this format.

public static final int AUDIO_OFFLOAD_GAPLESS_SUPPORTED

The renderer supports audio offload and gapless transitions with this format.

public static final int AUDIO_OFFLOAD_SUPPORTED

The renderer supports audio offload with this format.

public static final int AUDIO_OFFLOAD_NOT_SUPPORTED

Audio offload is not supported with this format.

Methods

public static int create(int formatSupport)

Returns RendererCapabilities.Capabilities for the given .

RendererCapabilities.AdaptiveSupport is set to RendererCapabilities.ADAPTIVE_NOT_SUPPORTED, RendererCapabilities.TunnelingSupport is set to RendererCapabilities.TUNNELING_NOT_SUPPORTED, RendererCapabilities.HardwareAccelerationSupport is set to RendererCapabilities.HARDWARE_ACCELERATION_NOT_SUPPORTED, RendererCapabilities.DecoderSupport is set to RendererCapabilities.DECODER_SUPPORT_PRIMARY and RendererCapabilities.AudioOffloadSupport is set to RendererCapabilities.AUDIO_OFFLOAD_NOT_SUPPORTED.

Parameters:

formatSupport: The .

Returns:

The combined RendererCapabilities.Capabilities of the given , RendererCapabilities.ADAPTIVE_NOT_SUPPORTED, RendererCapabilities.TUNNELING_NOT_SUPPORTED and RendererCapabilities.AUDIO_OFFLOAD_NOT_SUPPORTED.

public static int create(int formatSupport, int adaptiveSupport, int tunnelingSupport)

Returns RendererCapabilities.Capabilities combining the given , RendererCapabilities.AdaptiveSupport and RendererCapabilities.TunnelingSupport.

RendererCapabilities.HardwareAccelerationSupport is set to RendererCapabilities.HARDWARE_ACCELERATION_NOT_SUPPORTED, RendererCapabilities.DecoderSupport is set to RendererCapabilities.DECODER_SUPPORT_PRIMARY, and RendererCapabilities.AudioOffloadSupport is set to RendererCapabilities.AUDIO_OFFLOAD_NOT_SUPPORTED.

Parameters:

formatSupport: The .
adaptiveSupport: The RendererCapabilities.AdaptiveSupport.
tunnelingSupport: The RendererCapabilities.TunnelingSupport.

Returns:

The combined RendererCapabilities.Capabilities.

public static int create(int formatSupport, int adaptiveSupport, int tunnelingSupport, int audioOffloadSupport)

Returns RendererCapabilities.Capabilities combining the given , RendererCapabilities.AdaptiveSupport, RendererCapabilities.TunnelingSupport, and RendererCapabilities.AudioOffloadSupport.

RendererCapabilities.HardwareAccelerationSupport is set to RendererCapabilities.HARDWARE_ACCELERATION_NOT_SUPPORTED and RendererCapabilities.DecoderSupport is set to RendererCapabilities.DECODER_SUPPORT_PRIMARY.

Parameters:

formatSupport: The .
adaptiveSupport: The RendererCapabilities.AdaptiveSupport.
tunnelingSupport: The RendererCapabilities.TunnelingSupport.
audioOffloadSupport: The RendererCapabilities.AudioOffloadSupport.

Returns:

The combined RendererCapabilities.Capabilities.

public static int create(int formatSupport, int adaptiveSupport, int tunnelingSupport, int hardwareAccelerationSupport, int decoderSupport)

Returns RendererCapabilities.Capabilities combining the given , RendererCapabilities.AdaptiveSupport, RendererCapabilities.TunnelingSupport, RendererCapabilities.HardwareAccelerationSupport, and RendererCapabilities.DecoderSupport.

RendererCapabilities.AudioOffloadSupport is set to RendererCapabilities.AUDIO_OFFLOAD_NOT_SUPPORTED.

Parameters:

formatSupport: The .
adaptiveSupport: The RendererCapabilities.AdaptiveSupport.
tunnelingSupport: The RendererCapabilities.TunnelingSupport.
hardwareAccelerationSupport: The RendererCapabilities.HardwareAccelerationSupport.
decoderSupport: The RendererCapabilities.DecoderSupport.

Returns:

The combined RendererCapabilities.Capabilities.

public static int create(int formatSupport, int adaptiveSupport, int tunnelingSupport, int hardwareAccelerationSupport, int decoderSupport, int audioOffloadSupport)

Returns RendererCapabilities.Capabilities combining the given , RendererCapabilities.AdaptiveSupport, RendererCapabilities.TunnelingSupport, RendererCapabilities.HardwareAccelerationSupport, RendererCapabilities.DecoderSupport and RendererCapabilities.AudioOffloadSupport.

Parameters:

formatSupport: The .
adaptiveSupport: The RendererCapabilities.AdaptiveSupport.
tunnelingSupport: The RendererCapabilities.TunnelingSupport.
hardwareAccelerationSupport: The RendererCapabilities.HardwareAccelerationSupport.
decoderSupport: The RendererCapabilities.DecoderSupport.
audioOffloadSupport: The RendererCapabilities.AudioOffloadSupport

Returns:

The combined RendererCapabilities.Capabilities.

public static int getFormatSupport(int supportFlags)

Returns the from the combined RendererCapabilities.Capabilities.

Parameters:

supportFlags: The combined RendererCapabilities.Capabilities.

Returns:

The only.

public static boolean isFormatSupported(int supportFlags, boolean allowExceedsCapabilities)

Returns whether the from the combined RendererCapabilities.Capabilities indicates the format is supported.

A format is considered supported if its value is C.FORMAT_HANDLED, or optionally C.FORMAT_EXCEEDS_CAPABILITIES if enabled by allowExceedsCapabilities.

Parameters:

supportFlags: The combined RendererCapabilities.Capabilities.
allowExceedsCapabilities: Whether C.FORMAT_EXCEEDS_CAPABILITIES should be considered as supported.

Returns:

Whether the RendererCapabilities.Capabilities indicate a format is supported.

public static int getAdaptiveSupport(int supportFlags)

Returns the RendererCapabilities.AdaptiveSupport from the combined RendererCapabilities.Capabilities.

Parameters:

supportFlags: The combined RendererCapabilities.Capabilities.

Returns:

The RendererCapabilities.AdaptiveSupport only.

public static int getTunnelingSupport(int supportFlags)

Returns the RendererCapabilities.TunnelingSupport from the combined RendererCapabilities.Capabilities.

Parameters:

supportFlags: The combined RendererCapabilities.Capabilities.

Returns:

The RendererCapabilities.TunnelingSupport only.

public static int getHardwareAccelerationSupport(int supportFlags)

Returns the RendererCapabilities.HardwareAccelerationSupport from the combined RendererCapabilities.Capabilities.

Parameters:

supportFlags: The combined RendererCapabilities.Capabilities.

Returns:

The RendererCapabilities.HardwareAccelerationSupport only.

public static int getDecoderSupport(int supportFlags)

Returns the RendererCapabilities.DecoderSupport from the combined RendererCapabilities.Capabilities.

Parameters:

supportFlags: The combined RendererCapabilities.Capabilities.

Returns:

The RendererCapabilities.DecoderSupport only.

public static int getAudioOffloadSupport(int supportFlags)

Returns the RendererCapabilities.AudioOffloadSupport from the combined RendererCapabilities.Capabilities.

Parameters:

supportFlags: The combined RendererCapabilities.Capabilities.

Returns:

The RendererCapabilities.AudioOffloadSupport only.

public java.lang.String getName()

Returns the name of the Renderer.

public int getTrackType()

Returns the track type that the Renderer handles. For example, a video renderer will return C.TRACK_TYPE_VIDEO, an audio renderer will return C.TRACK_TYPE_AUDIO, a text renderer will return C.TRACK_TYPE_TEXT, and so on.

Returns:

The .

See also: Renderer.getTrackType()

public int supportsFormat(Format format)

Returns the extent to which the Renderer supports a given format.

Parameters:

format: The format.

Returns:

The RendererCapabilities.Capabilities for this format.

public int supportsMixedMimeTypeAdaptation()

Returns the extent to which the Renderer supports adapting between supported formats that have different MIME types.

Returns:

The RendererCapabilities.AdaptiveSupport for adapting between supported formats that have different MIME types.

public void setListener(RendererCapabilities.Listener listener)

Sets the RendererCapabilities.Listener.

Parameters:

listener: The listener to be set.

public void clearListener()

Clears the RendererCapabilities.Listener.

Source

/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package androidx.media3.exoplayer;

import static java.lang.annotation.ElementType.TYPE_USE;

import android.annotation.SuppressLint;
import androidx.annotation.IntDef;
import androidx.media3.common.C;
import androidx.media3.common.Format;
import androidx.media3.common.util.UnstableApi;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/** Defines the capabilities of a {@link Renderer}. */
@UnstableApi
public interface RendererCapabilities {

  /** Listener for renderer capabilities events. */
  interface Listener {

    /**
     * Called when the renderer capabilities are changed.
     *
     * <p>This method will be called on the playback thread.
     *
     * @param renderer The renderer that has its capabilities changed.
     */
    void onRendererCapabilitiesChanged(Renderer renderer);
  }

  /** A mask to apply to {@link Capabilities} to obtain the {@link C.FormatSupport} only. */
  int FORMAT_SUPPORT_MASK = 0b111;

  /**
   * Level of renderer support for adaptive format switches. One of {@link #ADAPTIVE_SEAMLESS},
   * {@link #ADAPTIVE_NOT_SEAMLESS} or {@link #ADAPTIVE_NOT_SUPPORTED}.
   */
  @Documented
  @Retention(RetentionPolicy.SOURCE)
  @Target(TYPE_USE)
  @IntDef({ADAPTIVE_SEAMLESS, ADAPTIVE_NOT_SEAMLESS, ADAPTIVE_NOT_SUPPORTED})
  @interface AdaptiveSupport {}

  /** A mask to apply to {@link Capabilities} to obtain the {@link AdaptiveSupport} only. */
  int ADAPTIVE_SUPPORT_MASK = 0b11 << 3;

  /** The {@link Renderer} can seamlessly adapt between formats. */
  int ADAPTIVE_SEAMLESS = 0b10 << 3;

  /**
   * The {@link Renderer} can adapt between formats, but may suffer a brief discontinuity
   * (~50-100ms) when adaptation occurs.
   */
  int ADAPTIVE_NOT_SEAMLESS = 0b01 << 3;

  /** The {@link Renderer} does not support adaptation between formats. */
  int ADAPTIVE_NOT_SUPPORTED = 0;

  /**
   * Level of renderer support for tunneling. One of {@link #TUNNELING_SUPPORTED} or {@link
   * #TUNNELING_NOT_SUPPORTED}.
   */
  @Documented
  @Retention(RetentionPolicy.SOURCE)
  @Target(TYPE_USE)
  @IntDef({TUNNELING_SUPPORTED, TUNNELING_NOT_SUPPORTED})
  @interface TunnelingSupport {}

  /** A mask to apply to {@link Capabilities} to obtain {@link TunnelingSupport} only. */
  int TUNNELING_SUPPORT_MASK = 0b1 << 5;

  /** The {@link Renderer} supports tunneled output. */
  int TUNNELING_SUPPORTED = 0b1 << 5;

  /** The {@link Renderer} does not support tunneled output. */
  int TUNNELING_NOT_SUPPORTED = 0;

  /**
   * Level of renderer support for hardware acceleration. One of {@link
   * #HARDWARE_ACCELERATION_SUPPORTED} and {@link #HARDWARE_ACCELERATION_NOT_SUPPORTED}.
   *
   * <p>For video renderers, the level of support is indicated for non-tunneled output.
   */
  @Documented
  @Retention(RetentionPolicy.SOURCE)
  @Target(TYPE_USE)
  @IntDef({
    HARDWARE_ACCELERATION_SUPPORTED,
    HARDWARE_ACCELERATION_NOT_SUPPORTED,
  })
  @interface HardwareAccelerationSupport {}

  /** A mask to apply to {@link Capabilities} to obtain {@link HardwareAccelerationSupport} only. */
  int HARDWARE_ACCELERATION_SUPPORT_MASK = 0b1 << 6;

  /** The renderer is able to use hardware acceleration. */
  int HARDWARE_ACCELERATION_SUPPORTED = 0b1 << 6;

  /** The renderer is not able to use hardware acceleration. */
  int HARDWARE_ACCELERATION_NOT_SUPPORTED = 0;

  /**
   * Level of decoder support. One of {@link #DECODER_SUPPORT_PRIMARY}, {@link
   * #DECODER_SUPPORT_FALLBACK}, and {@link #DECODER_SUPPORT_FALLBACK_MIMETYPE}}.
   *
   * <p>For video renderers, the level of support is indicated for non-tunneled output.
   */
  @Documented
  @Retention(RetentionPolicy.SOURCE)
  @Target(TYPE_USE)
  @IntDef({DECODER_SUPPORT_FALLBACK_MIMETYPE, DECODER_SUPPORT_PRIMARY, DECODER_SUPPORT_FALLBACK})
  @interface DecoderSupport {}

  /** A mask to apply to {@link Capabilities} to obtain {@link DecoderSupport} only. */
  int DECODER_SUPPORT_MASK = 0b11 << 7;

  /**
   * The format's MIME type is unsupported and the renderer may use a decoder for a fallback MIME
   * type.
   */
  int DECODER_SUPPORT_FALLBACK_MIMETYPE = 0b10 << 7;

  /** The renderer is able to use the primary decoder for the format's MIME type. */
  int DECODER_SUPPORT_PRIMARY = 0b1 << 7;

  /** The format exceeds the primary decoder's capabilities but is supported by fallback decoder */
  int DECODER_SUPPORT_FALLBACK = 0;

  /**
   * Level of renderer support for audio offload.
   *
   * <p>Speed change and gapless transition support with audio offload is represented by the bit
   * mask flags {@link #AUDIO_OFFLOAD_SPEED_CHANGE_SUPPORTED} and {@link
   * #AUDIO_OFFLOAD_GAPLESS_SUPPORTED} respectively. If neither feature is supported then the value
   * will be either {@link #AUDIO_OFFLOAD_SUPPORTED} or {@link #AUDIO_OFFLOAD_NOT_SUPPORTED}.
   *
   * <p>For non-audio renderers, the level of support is always {@link
   * #AUDIO_OFFLOAD_NOT_SUPPORTED}.
   */
  @Documented
  @Retention(RetentionPolicy.SOURCE)
  @Target(TYPE_USE)
  @IntDef({
    AUDIO_OFFLOAD_SPEED_CHANGE_SUPPORTED,
    AUDIO_OFFLOAD_GAPLESS_SUPPORTED,
    AUDIO_OFFLOAD_SUPPORTED,
    AUDIO_OFFLOAD_NOT_SUPPORTED
  })
  @interface AudioOffloadSupport {}

  /** A mask to apply to {@link Capabilities} to obtain {@link AudioOffloadSupport} only. */
  int AUDIO_OFFLOAD_SUPPORT_MASK = 0b111 << 9;

  /** The renderer supports audio offload and speed changes with this format. */
  int AUDIO_OFFLOAD_SPEED_CHANGE_SUPPORTED = 0b100 << 9;

  /** The renderer supports audio offload and gapless transitions with this format. */
  int AUDIO_OFFLOAD_GAPLESS_SUPPORTED = 0b10 << 9;

  /** The renderer supports audio offload with this format. */
  int AUDIO_OFFLOAD_SUPPORTED = 0b1 << 9;

  /** Audio offload is not supported with this format. */
  int AUDIO_OFFLOAD_NOT_SUPPORTED = 0;

  /**
   * Combined renderer capabilities.
   *
   * <p>This is a bitwise OR of {@link C.FormatSupport}, {@link AdaptiveSupport}, {@link
   * TunnelingSupport}, {@link HardwareAccelerationSupport}, {@link DecoderSupport} and {@link
   * AudioOffloadSupport}. Use {@link #getFormatSupport}, {@link #getAdaptiveSupport}, {@link
   * #getTunnelingSupport}, {@link #getHardwareAccelerationSupport}, {@link #getDecoderSupport} and
   * {@link AudioOffloadSupport} to obtain individual components. Use {@link #create(int)}, {@link
   * #create(int, int, int)}, {@link #create(int, int, int, int)}, or {@link #create(int, int, int,
   * int, int, int)} to create combined capabilities from individual components.
   *
   * <p>Possible values:
   *
   * <ul>
   *   <li>{@link C.FormatSupport}: The level of support for the format itself. One of {@link
   *       C#FORMAT_HANDLED}, {@link C#FORMAT_EXCEEDS_CAPABILITIES}, {@link
   *       C#FORMAT_UNSUPPORTED_DRM}, {@link C#FORMAT_UNSUPPORTED_SUBTYPE} and {@link
   *       C#FORMAT_UNSUPPORTED_TYPE}.
   *   <li>{@link AdaptiveSupport}: The level of support for adapting from the format to another
   *       format of the same MIME type. One of {@link #ADAPTIVE_SEAMLESS}, {@link
   *       #ADAPTIVE_NOT_SEAMLESS} and {@link #ADAPTIVE_NOT_SUPPORTED}. Only set if the level of
   *       support for the format itself is {@link C#FORMAT_HANDLED} or {@link
   *       C#FORMAT_EXCEEDS_CAPABILITIES}.
   *   <li>{@link TunnelingSupport}: The level of support for tunneling. One of {@link
   *       #TUNNELING_SUPPORTED} and {@link #TUNNELING_NOT_SUPPORTED}. Only set if the level of
   *       support for the format itself is {@link C#FORMAT_HANDLED} or {@link
   *       C#FORMAT_EXCEEDS_CAPABILITIES}.
   *   <li>{@link HardwareAccelerationSupport}: The level of support for hardware acceleration. One
   *       of {@link #HARDWARE_ACCELERATION_SUPPORTED} and {@link
   *       #HARDWARE_ACCELERATION_NOT_SUPPORTED}.
   *   <li>{@link DecoderSupport}: The level of decoder support. One of {@link
   *       #DECODER_SUPPORT_PRIMARY}, {@link #DECODER_SUPPORT_FALLBACK}, or {@link
   *       #DECODER_SUPPORT_FALLBACK_MIMETYPE}.
   *   <li>{@link AudioOffloadSupport}: The level of offload support. Value will have the flag
   *       {@link #AUDIO_OFFLOAD_SUPPORTED} or be {@link #AUDIO_OFFLOAD_NOT_SUPPORTED}. In addition,
   *       if it is {@link #AUDIO_OFFLOAD_SUPPORTED}, then one can check for {@link
   *       #AUDIO_OFFLOAD_SPEED_CHANGE_SUPPORTED} and {@link #AUDIO_OFFLOAD_GAPLESS_SUPPORTED}.
   *       These represent speed change and gapless transition support with audio offload
   *       respectively.
   * </ul>
   */
  @Documented
  @Retention(RetentionPolicy.SOURCE)
  // Intentionally empty to prevent assignment or comparison with individual flags without masking.
  @Target(TYPE_USE)
  @IntDef({})
  @interface Capabilities {}

  /**
   * Returns {@link Capabilities} for the given {@link C.FormatSupport}.
   *
   * <p>{@link AdaptiveSupport} is set to {@link #ADAPTIVE_NOT_SUPPORTED}, {@link TunnelingSupport}
   * is set to {@link #TUNNELING_NOT_SUPPORTED}, {@link HardwareAccelerationSupport} is set to
   * {@link #HARDWARE_ACCELERATION_NOT_SUPPORTED}, {@link DecoderSupport} is set to {@link
   * #DECODER_SUPPORT_PRIMARY} and {@link AudioOffloadSupport} is set to {@link
   * #AUDIO_OFFLOAD_NOT_SUPPORTED}.
   *
   * @param formatSupport The {@link C.FormatSupport}.
   * @return The combined {@link Capabilities} of the given {@link C.FormatSupport}, {@link
   *     #ADAPTIVE_NOT_SUPPORTED}, {@link #TUNNELING_NOT_SUPPORTED} and {@link
   *     #AUDIO_OFFLOAD_NOT_SUPPORTED}.
   */
  static @Capabilities int create(@C.FormatSupport int formatSupport) {
    return create(
        formatSupport,
        ADAPTIVE_NOT_SUPPORTED,
        TUNNELING_NOT_SUPPORTED,
        AUDIO_OFFLOAD_NOT_SUPPORTED);
  }

  /**
   * Returns {@link Capabilities} combining the given {@link C.FormatSupport}, {@link
   * AdaptiveSupport} and {@link TunnelingSupport}.
   *
   * <p>{@link HardwareAccelerationSupport} is set to {@link #HARDWARE_ACCELERATION_NOT_SUPPORTED},
   * {@link DecoderSupport} is set to {@link #DECODER_SUPPORT_PRIMARY}, and {@link
   * AudioOffloadSupport} is set to {@link #AUDIO_OFFLOAD_NOT_SUPPORTED}.
   *
   * @param formatSupport The {@link C.FormatSupport}.
   * @param adaptiveSupport The {@link AdaptiveSupport}.
   * @param tunnelingSupport The {@link TunnelingSupport}.
   * @return The combined {@link Capabilities}.
   */
  static @Capabilities int create(
      @C.FormatSupport int formatSupport,
      @AdaptiveSupport int adaptiveSupport,
      @TunnelingSupport int tunnelingSupport) {
    return create(
        formatSupport,
        adaptiveSupport,
        tunnelingSupport,
        HARDWARE_ACCELERATION_NOT_SUPPORTED,
        DECODER_SUPPORT_PRIMARY,
        AUDIO_OFFLOAD_NOT_SUPPORTED);
  }

  /**
   * Returns {@link Capabilities} combining the given {@link C.FormatSupport}, {@link
   * AdaptiveSupport}, {@link TunnelingSupport}, and {@link AudioOffloadSupport}.
   *
   * <p>{@link HardwareAccelerationSupport} is set to {@link #HARDWARE_ACCELERATION_NOT_SUPPORTED}
   * and {@link DecoderSupport} is set to {@link #DECODER_SUPPORT_PRIMARY}.
   *
   * @param formatSupport The {@link C.FormatSupport}.
   * @param adaptiveSupport The {@link AdaptiveSupport}.
   * @param tunnelingSupport The {@link TunnelingSupport}.
   * @param audioOffloadSupport The {@link AudioOffloadSupport}.
   * @return The combined {@link Capabilities}.
   */
  static @Capabilities int create(
      @C.FormatSupport int formatSupport,
      @AdaptiveSupport int adaptiveSupport,
      @TunnelingSupport int tunnelingSupport,
      @AudioOffloadSupport int audioOffloadSupport) {
    return create(
        formatSupport,
        adaptiveSupport,
        tunnelingSupport,
        HARDWARE_ACCELERATION_NOT_SUPPORTED,
        DECODER_SUPPORT_PRIMARY,
        audioOffloadSupport);
  }

  /**
   * Returns {@link Capabilities} combining the given {@link C.FormatSupport}, {@link
   * AdaptiveSupport}, {@link TunnelingSupport}, {@link HardwareAccelerationSupport}, and {@link
   * DecoderSupport}.
   *
   * <p>{@link AudioOffloadSupport} is set to {@link #AUDIO_OFFLOAD_NOT_SUPPORTED}.
   *
   * @param formatSupport The {@link C.FormatSupport}.
   * @param adaptiveSupport The {@link AdaptiveSupport}.
   * @param tunnelingSupport The {@link TunnelingSupport}.
   * @param hardwareAccelerationSupport The {@link HardwareAccelerationSupport}.
   * @param decoderSupport The {@link DecoderSupport}.
   * @return The combined {@link Capabilities}.
   */
  static @Capabilities int create(
      @C.FormatSupport int formatSupport,
      @AdaptiveSupport int adaptiveSupport,
      @TunnelingSupport int tunnelingSupport,
      @HardwareAccelerationSupport int hardwareAccelerationSupport,
      @DecoderSupport int decoderSupport) {
    return create(
        formatSupport,
        adaptiveSupport,
        tunnelingSupport,
        hardwareAccelerationSupport,
        decoderSupport,
        AUDIO_OFFLOAD_NOT_SUPPORTED);
  }

  /**
   * Returns {@link Capabilities} combining the given {@link C.FormatSupport}, {@link
   * AdaptiveSupport}, {@link TunnelingSupport}, {@link HardwareAccelerationSupport}, {@link
   * DecoderSupport} and {@link AudioOffloadSupport}.
   *
   * @param formatSupport The {@link C.FormatSupport}.
   * @param adaptiveSupport The {@link AdaptiveSupport}.
   * @param tunnelingSupport The {@link TunnelingSupport}.
   * @param hardwareAccelerationSupport The {@link HardwareAccelerationSupport}.
   * @param decoderSupport The {@link DecoderSupport}.
   * @param audioOffloadSupport The {@link AudioOffloadSupport}
   * @return The combined {@link Capabilities}.
   */
  // Suppression needed for IntDef casting.
  @SuppressLint("WrongConstant")
  static @Capabilities int create(
      @C.FormatSupport int formatSupport,
      @AdaptiveSupport int adaptiveSupport,
      @TunnelingSupport int tunnelingSupport,
      @HardwareAccelerationSupport int hardwareAccelerationSupport,
      @DecoderSupport int decoderSupport,
      @AudioOffloadSupport int audioOffloadSupport) {
    return formatSupport
        | adaptiveSupport
        | tunnelingSupport
        | hardwareAccelerationSupport
        | decoderSupport
        | audioOffloadSupport;
  }

  /**
   * Returns the {@link C.FormatSupport} from the combined {@link Capabilities}.
   *
   * @param supportFlags The combined {@link Capabilities}.
   * @return The {@link C.FormatSupport} only.
   */
  // Suppression needed for IntDef casting.
  @SuppressLint("WrongConstant")
  static @C.FormatSupport int getFormatSupport(@Capabilities int supportFlags) {
    return supportFlags & FORMAT_SUPPORT_MASK;
  }

  /**
   * Returns whether the {@link C.FormatSupport} from the combined {@link Capabilities} indicates
   * the format is supported.
   *
   * <p>A format is considered supported if its {@link C.FormatSupport} value is {@link
   * C#FORMAT_HANDLED}, or optionally {@link C#FORMAT_EXCEEDS_CAPABILITIES} if enabled by {@code
   * allowExceedsCapabilities}.
   *
   * @param supportFlags The combined {@link Capabilities}.
   * @param allowExceedsCapabilities Whether {@link C#FORMAT_EXCEEDS_CAPABILITIES} should be
   *     considered as supported.
   * @return Whether the {@link Capabilities} indicate a format is supported.
   */
  static boolean isFormatSupported(
      @Capabilities int supportFlags, boolean allowExceedsCapabilities) {
    @C.FormatSupport int formatSupport = getFormatSupport(supportFlags);
    return formatSupport == C.FORMAT_HANDLED
        || (allowExceedsCapabilities && formatSupport == C.FORMAT_EXCEEDS_CAPABILITIES);
  }

  /**
   * Returns the {@link AdaptiveSupport} from the combined {@link Capabilities}.
   *
   * @param supportFlags The combined {@link Capabilities}.
   * @return The {@link AdaptiveSupport} only.
   */
  // Suppression needed for IntDef casting.
  @SuppressLint("WrongConstant")
  static @AdaptiveSupport int getAdaptiveSupport(@Capabilities int supportFlags) {
    return supportFlags & ADAPTIVE_SUPPORT_MASK;
  }

  /**
   * Returns the {@link TunnelingSupport} from the combined {@link Capabilities}.
   *
   * @param supportFlags The combined {@link Capabilities}.
   * @return The {@link TunnelingSupport} only.
   */
  // Suppression needed for IntDef casting.
  @SuppressLint("WrongConstant")
  static @TunnelingSupport int getTunnelingSupport(@Capabilities int supportFlags) {
    return supportFlags & TUNNELING_SUPPORT_MASK;
  }

  /**
   * Returns the {@link HardwareAccelerationSupport} from the combined {@link Capabilities}.
   *
   * @param supportFlags The combined {@link Capabilities}.
   * @return The {@link HardwareAccelerationSupport} only.
   */
  // Suppression needed for IntDef casting.
  @SuppressLint("WrongConstant")
  static @HardwareAccelerationSupport int getHardwareAccelerationSupport(
      @Capabilities int supportFlags) {
    return supportFlags & HARDWARE_ACCELERATION_SUPPORT_MASK;
  }

  /**
   * Returns the {@link DecoderSupport} from the combined {@link Capabilities}.
   *
   * @param supportFlags The combined {@link Capabilities}.
   * @return The {@link DecoderSupport} only.
   */
  // Suppression needed for IntDef casting.
  @SuppressLint("WrongConstant")
  static @DecoderSupport int getDecoderSupport(@Capabilities int supportFlags) {
    return supportFlags & DECODER_SUPPORT_MASK;
  }

  /**
   * Returns the {@link AudioOffloadSupport} from the combined {@link Capabilities}.
   *
   * @param supportFlags The combined {@link Capabilities}.
   * @return The {@link AudioOffloadSupport} only.
   */
  // Suppression needed for IntDef casting.
  @SuppressLint("WrongConstant")
  static @AudioOffloadSupport int getAudioOffloadSupport(@Capabilities int supportFlags) {
    return supportFlags & AUDIO_OFFLOAD_SUPPORT_MASK;
  }

  /** Returns the name of the {@link Renderer}. */
  String getName();

  /**
   * Returns the track type that the {@link Renderer} handles. For example, a video renderer will
   * return {@link C#TRACK_TYPE_VIDEO}, an audio renderer will return {@link C#TRACK_TYPE_AUDIO}, a
   * text renderer will return {@link C#TRACK_TYPE_TEXT}, and so on.
   *
   * @see Renderer#getTrackType()
   * @return The {@link C.TrackType track type}.
   */
  @C.TrackType
  int getTrackType();

  /**
   * Returns the extent to which the {@link Renderer} supports a given format.
   *
   * @param format The format.
   * @return The {@link Capabilities} for this format.
   * @throws ExoPlaybackException If an error occurs.
   */
  @Capabilities
  int supportsFormat(Format format) throws ExoPlaybackException;

  /**
   * Returns the extent to which the {@link Renderer} supports adapting between supported formats
   * that have different MIME types.
   *
   * @return The {@link AdaptiveSupport} for adapting between supported formats that have different
   *     MIME types.
   * @throws ExoPlaybackException If an error occurs.
   */
  @AdaptiveSupport
  int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException;

  /**
   * Sets the {@link Listener}.
   *
   * @param listener The listener to be set.
   */
  default void setListener(Listener listener) {
    // Do nothing.
  }

  /** Clears the {@link Listener}. */
  default void clearListener() {
    // Do nothing.
  }
}