diff --git a/libraries/cast/src/main/java/androidx/media3/cast/CastPlayer.java b/libraries/cast/src/main/java/androidx/media3/cast/CastPlayer.java index 5481c2d022..f775c1c0ce 100644 --- a/libraries/cast/src/main/java/androidx/media3/cast/CastPlayer.java +++ b/libraries/cast/src/main/java/androidx/media3/cast/CastPlayer.java @@ -726,6 +726,7 @@ public final class CastPlayer extends BasePlayer { /** This method is not supported and does nothing. */ @Override public void setVideoTextureView(@Nullable TextureView textureView) {} + /** This method is not supported and does nothing. */ @Override public void clearVideoTextureView(@Nullable TextureView textureView) {} diff --git a/libraries/cast/src/main/java/androidx/media3/cast/CastTimeline.java b/libraries/cast/src/main/java/androidx/media3/cast/CastTimeline.java index 7cf90c5a4d..1621c7de7f 100644 --- a/libraries/cast/src/main/java/androidx/media3/cast/CastTimeline.java +++ b/libraries/cast/src/main/java/androidx/media3/cast/CastTimeline.java @@ -43,14 +43,18 @@ import java.util.Arrays; /** The duration of the item in microseconds, or {@link C#TIME_UNSET} if unknown. */ public final long durationUs; + /** * The default start position of the item in microseconds, or {@link C#TIME_UNSET} if unknown. */ public final long defaultPositionUs; + /** Whether the item is live content, or {@code false} if unknown. */ public final boolean isLive; + /** The original media item that has been set or added to the playlist. */ public final MediaItem mediaItem; + /** The {@linkplain MediaInfo#getContentId() content ID} of the cast media queue item. */ public final String contentId; diff --git a/libraries/common/src/main/java/androidx/media3/common/AdOverlayInfo.java b/libraries/common/src/main/java/androidx/media3/common/AdOverlayInfo.java index e411912a9b..268ce25be7 100644 --- a/libraries/common/src/main/java/androidx/media3/common/AdOverlayInfo.java +++ b/libraries/common/src/main/java/androidx/media3/common/AdOverlayInfo.java @@ -45,12 +45,16 @@ public final class AdOverlayInfo { @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({PURPOSE_CONTROLS, PURPOSE_CLOSE_AD, PURPOSE_OTHER, PURPOSE_NOT_VISIBLE}) public @interface Purpose {} + /** Purpose for playback controls overlaying the player. */ public static final int PURPOSE_CONTROLS = 1; + /** Purpose for ad close buttons overlaying the player. */ public static final int PURPOSE_CLOSE_AD = 2; + /** Purpose for other overlays. */ public static final int PURPOSE_OTHER = 3; + /** Purpose for overlays that are not visible. */ public static final int PURPOSE_NOT_VISIBLE = 4; @@ -94,8 +98,10 @@ public final class AdOverlayInfo { /** The overlay view. */ public final View view; + /** The purpose of the overlay view. */ public final @Purpose int purpose; + /** An optional, detailed reason that the overlay view is needed. */ @Nullable public final String reasonDetail; diff --git a/libraries/common/src/main/java/androidx/media3/common/AdPlaybackState.java b/libraries/common/src/main/java/androidx/media3/common/AdPlaybackState.java index e481e2de2c..2e5c97b4df 100644 --- a/libraries/common/src/main/java/androidx/media3/common/AdPlaybackState.java +++ b/libraries/common/src/main/java/androidx/media3/common/AdPlaybackState.java @@ -62,8 +62,10 @@ public final class AdPlaybackState implements Bundleable { * C#TIME_END_OF_SOURCE} to indicate a postroll ad. */ public final long timeUs; + /** The number of ads in the ad group, or {@link C#LENGTH_UNSET} if unknown. */ public final int count; + /** * The original number of ads in the ad group in case the ad group is only partially available, * or {@link C#LENGTH_UNSET} if unknown. An ad can be partially available when a server side @@ -71,17 +73,22 @@ public final class AdPlaybackState implements Bundleable { * missing. */ public final int originalCount; + /** The URI of each ad in the ad group. */ public final @NullableType Uri[] uris; + /** The state of each ad in the ad group. */ public final @AdState int[] states; + /** The durations of each ad in the ad group, in microseconds. */ public final long[] durationsUs; + /** * The offset in microseconds which should be added to the content stream when resuming playback * after the ad group. */ public final long contentResumeOffsetUs; + /** Whether this ad group is server-side inserted and part of the content stream. */ public final boolean isServerSideInserted; @@ -535,14 +542,19 @@ public final class AdPlaybackState implements Bundleable { AD_STATE_ERROR, }) public @interface AdState {} + /** State for an ad that does not yet have a URL. */ public static final int AD_STATE_UNAVAILABLE = 0; + /** State for an ad that has a URL but has not yet been played. */ public static final int AD_STATE_AVAILABLE = 1; + /** State for an ad that was skipped. */ public static final int AD_STATE_SKIPPED = 2; + /** State for an ad that was played in full. */ public static final int AD_STATE_PLAYED = 3; + /** State for an ad that could not be loaded. */ public static final int AD_STATE_ERROR = 4; @@ -564,12 +576,15 @@ public final class AdPlaybackState implements Bundleable { /** The number of ad groups. */ public final int adGroupCount; + /** The position offset in the first unplayed ad at which to begin playback, in microseconds. */ public final long adResumePositionUs; + /** * The duration of the content period in microseconds, if known. {@link C#TIME_UNSET} otherwise. */ public final long contentDurationUs; + /** * The number of ad groups that have been removed. Ad groups with indices between {@code 0} * (inclusive) and {@code removedAdGroupCount} (exclusive) will be empty and must not be modified diff --git a/libraries/common/src/main/java/androidx/media3/common/AudioAttributes.java b/libraries/common/src/main/java/androidx/media3/common/AudioAttributes.java index 6406baf87a..ef163dc441 100644 --- a/libraries/common/src/main/java/androidx/media3/common/AudioAttributes.java +++ b/libraries/common/src/main/java/androidx/media3/common/AudioAttributes.java @@ -131,12 +131,16 @@ public final class AudioAttributes implements Bundleable { /** The {@link C.AudioContentType}. */ public final @C.AudioContentType int contentType; + /** The {@link C.AudioFlags}. */ public final @C.AudioFlags int flags; + /** The {@link C.AudioUsage}. */ public final @C.AudioUsage int usage; + /** The {@link C.AudioAllowedCapturePolicy}. */ public final @C.AudioAllowedCapturePolicy int allowedCapturePolicy; + /** The {@link C.SpatializationBehavior}. */ public final @C.SpatializationBehavior int spatializationBehavior; diff --git a/libraries/common/src/main/java/androidx/media3/common/AuxEffectInfo.java b/libraries/common/src/main/java/androidx/media3/common/AuxEffectInfo.java index a94f1afcaf..d46158c46c 100644 --- a/libraries/common/src/main/java/androidx/media3/common/AuxEffectInfo.java +++ b/libraries/common/src/main/java/androidx/media3/common/AuxEffectInfo.java @@ -41,6 +41,7 @@ public final class AuxEffectInfo { * @see android.media.AudioTrack#attachAuxEffect(int) */ public final int effectId; + /** * The send level for the effect. * diff --git a/libraries/common/src/main/java/androidx/media3/common/C.java b/libraries/common/src/main/java/androidx/media3/common/C.java index ed3fb91c0a..86d37542d3 100644 --- a/libraries/common/src/main/java/androidx/media3/common/C.java +++ b/libraries/common/src/main/java/androidx/media3/common/C.java @@ -120,12 +120,16 @@ public final class C { CRYPTO_TYPE_FRAMEWORK, }) public @interface CryptoType {} + /** No crypto. */ public static final int CRYPTO_TYPE_NONE = 0; + /** An unsupported crypto type. */ public static final int CRYPTO_TYPE_UNSUPPORTED = 1; + /** Framework crypto in which a {@link MediaCodec} is configured with a {@link MediaCrypto}. */ public static final int CRYPTO_TYPE_FRAMEWORK = 2; + /** * Applications or extensions may define custom {@code CRYPTO_TYPE_*} constants greater than or * equal to this value. @@ -142,10 +146,13 @@ public final class C { @IntDef({CRYPTO_MODE_UNENCRYPTED, CRYPTO_MODE_AES_CTR, CRYPTO_MODE_AES_CBC}) @UnstableApi public @interface CryptoMode {} + /** See {@link MediaCodec#CRYPTO_MODE_UNENCRYPTED}. */ @UnstableApi public static final int CRYPTO_MODE_UNENCRYPTED = MediaCodec.CRYPTO_MODE_UNENCRYPTED; + /** See {@link MediaCodec#CRYPTO_MODE_AES_CTR}. */ @UnstableApi public static final int CRYPTO_MODE_AES_CTR = MediaCodec.CRYPTO_MODE_AES_CTR; + /** See {@link MediaCodec#CRYPTO_MODE_AES_CBC}. */ @UnstableApi public static final int CRYPTO_MODE_AES_CBC = MediaCodec.CRYPTO_MODE_AES_CBC; @@ -217,50 +224,73 @@ public final class C { ENCODING_PCM_FLOAT }) public @interface PcmEncoding {} + /** See {@link AudioFormat#ENCODING_INVALID}. */ @UnstableApi public static final int ENCODING_INVALID = AudioFormat.ENCODING_INVALID; + /** See {@link AudioFormat#ENCODING_PCM_8BIT}. */ @UnstableApi public static final int ENCODING_PCM_8BIT = AudioFormat.ENCODING_PCM_8BIT; + /** See {@link AudioFormat#ENCODING_PCM_16BIT}. */ @UnstableApi public static final int ENCODING_PCM_16BIT = AudioFormat.ENCODING_PCM_16BIT; + /** Like {@link #ENCODING_PCM_16BIT}, but with the bytes in big endian order. */ @UnstableApi public static final int ENCODING_PCM_16BIT_BIG_ENDIAN = 0x10000000; + /** PCM encoding with 24 bits per sample. */ @UnstableApi public static final int ENCODING_PCM_24BIT = 0x20000000; + /** PCM encoding with 32 bits per sample. */ @UnstableApi public static final int ENCODING_PCM_32BIT = 0x30000000; + /** See {@link AudioFormat#ENCODING_PCM_FLOAT}. */ @UnstableApi public static final int ENCODING_PCM_FLOAT = AudioFormat.ENCODING_PCM_FLOAT; + /** See {@link AudioFormat#ENCODING_MP3}. */ @UnstableApi public static final int ENCODING_MP3 = AudioFormat.ENCODING_MP3; + /** See {@link AudioFormat#ENCODING_AAC_LC}. */ @UnstableApi public static final int ENCODING_AAC_LC = AudioFormat.ENCODING_AAC_LC; + /** See {@link AudioFormat#ENCODING_AAC_HE_V1}. */ @UnstableApi public static final int ENCODING_AAC_HE_V1 = AudioFormat.ENCODING_AAC_HE_V1; + /** See {@link AudioFormat#ENCODING_AAC_HE_V2}. */ @UnstableApi public static final int ENCODING_AAC_HE_V2 = AudioFormat.ENCODING_AAC_HE_V2; + /** See {@link AudioFormat#ENCODING_AAC_XHE}. */ @UnstableApi public static final int ENCODING_AAC_XHE = AudioFormat.ENCODING_AAC_XHE; + /** See {@link AudioFormat#ENCODING_AAC_ELD}. */ @UnstableApi public static final int ENCODING_AAC_ELD = AudioFormat.ENCODING_AAC_ELD; + /** AAC Error Resilient Bit-Sliced Arithmetic Coding. */ @UnstableApi public static final int ENCODING_AAC_ER_BSAC = 0x40000000; + /** See {@link AudioFormat#ENCODING_AC3}. */ @UnstableApi public static final int ENCODING_AC3 = AudioFormat.ENCODING_AC3; + /** See {@link AudioFormat#ENCODING_E_AC3}. */ @UnstableApi public static final int ENCODING_E_AC3 = AudioFormat.ENCODING_E_AC3; + /** See {@link AudioFormat#ENCODING_E_AC3_JOC}. */ @UnstableApi public static final int ENCODING_E_AC3_JOC = AudioFormat.ENCODING_E_AC3_JOC; + /** See {@link AudioFormat#ENCODING_AC4}. */ @UnstableApi public static final int ENCODING_AC4 = AudioFormat.ENCODING_AC4; + /** See {@link AudioFormat#ENCODING_DTS}. */ @UnstableApi public static final int ENCODING_DTS = AudioFormat.ENCODING_DTS; + /** See {@link AudioFormat#ENCODING_DTS_HD}. */ @UnstableApi public static final int ENCODING_DTS_HD = AudioFormat.ENCODING_DTS_HD; + // TODO(internal b/283949283): Use AudioFormat.ENCODING_DTS_UHD_P2 when Android 14 is released. @UnstableApi public static final int ENCODING_DTS_UHD_P2 = 0x0000001e; + /** See {@link AudioFormat#ENCODING_DOLBY_TRUEHD}. */ @UnstableApi public static final int ENCODING_DOLBY_TRUEHD = AudioFormat.ENCODING_DOLBY_TRUEHD; + /** See {@link AudioFormat#ENCODING_OPUS}. */ @UnstableApi public static final int ENCODING_OPUS = AudioFormat.ENCODING_OPUS; @@ -277,6 +307,7 @@ public final class C { /** See {@link AudioAttributes#SPATIALIZATION_BEHAVIOR_AUTO}. */ public static final int SPATIALIZATION_BEHAVIOR_AUTO = AudioAttributes.SPATIALIZATION_BEHAVIOR_AUTO; + /** See {@link AudioAttributes#SPATIALIZATION_BEHAVIOR_NEVER}. */ public static final int SPATIALIZATION_BEHAVIOR_NEVER = AudioAttributes.SPATIALIZATION_BEHAVIOR_NEVER; @@ -305,20 +336,28 @@ public final class C { STREAM_TYPE_DEFAULT }) public @interface StreamType {} + /** See {@link AudioManager#STREAM_ALARM}. */ @UnstableApi public static final int STREAM_TYPE_ALARM = AudioManager.STREAM_ALARM; + /** See {@link AudioManager#STREAM_DTMF}. */ @UnstableApi public static final int STREAM_TYPE_DTMF = AudioManager.STREAM_DTMF; + /** See {@link AudioManager#STREAM_MUSIC}. */ @UnstableApi public static final int STREAM_TYPE_MUSIC = AudioManager.STREAM_MUSIC; + /** See {@link AudioManager#STREAM_NOTIFICATION}. */ @UnstableApi public static final int STREAM_TYPE_NOTIFICATION = AudioManager.STREAM_NOTIFICATION; + /** See {@link AudioManager#STREAM_RING}. */ @UnstableApi public static final int STREAM_TYPE_RING = AudioManager.STREAM_RING; + /** See {@link AudioManager#STREAM_SYSTEM}. */ @UnstableApi public static final int STREAM_TYPE_SYSTEM = AudioManager.STREAM_SYSTEM; + /** See {@link AudioManager#STREAM_VOICE_CALL}. */ @UnstableApi public static final int STREAM_TYPE_VOICE_CALL = AudioManager.STREAM_VOICE_CALL; + /** The default stream type used by audio renderers. Equal to {@link #STREAM_TYPE_MUSIC}. */ @UnstableApi public static final int STREAM_TYPE_DEFAULT = STREAM_TYPE_MUSIC; @@ -341,15 +380,20 @@ public final class C { VOLUME_FLAG_VIBRATE, }) public @interface VolumeFlags {} + /** See {@link AudioManager#FLAG_SHOW_UI}. */ public static final int VOLUME_FLAG_SHOW_UI = AudioManager.FLAG_SHOW_UI; + /** See {@link AudioManager#FLAG_ALLOW_RINGER_MODES}. */ public static final int VOLUME_FLAG_ALLOW_RINGER_MODES = AudioManager.FLAG_ALLOW_RINGER_MODES; + /** See {@link AudioManager#FLAG_PLAY_SOUND}. */ public static final int VOLUME_FLAG_PLAY_SOUND = AudioManager.FLAG_PLAY_SOUND; + /** See {@link AudioManager#FLAG_REMOVE_SOUND_AND_VIBRATE}. */ public static final int VOLUME_FLAG_REMOVE_SOUND_AND_VIBRATE = AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE; + /** See {@link AudioManager#FLAG_VIBRATE}. */ public static final int VOLUME_FLAG_VIBRATE = AudioManager.FLAG_VIBRATE; @@ -377,34 +421,44 @@ public final class C { AUDIO_CONTENT_TYPE_UNKNOWN }) public @interface AudioContentType {} + /** See {@link AudioAttributes#CONTENT_TYPE_MOVIE}. */ public static final int AUDIO_CONTENT_TYPE_MOVIE = AudioAttributes.CONTENT_TYPE_MOVIE; + /** * @deprecated Use {@link #AUDIO_CONTENT_TYPE_MOVIE} instead. */ @UnstableApi @Deprecated public static final int CONTENT_TYPE_MOVIE = AUDIO_CONTENT_TYPE_MOVIE; + /** See {@link AudioAttributes#CONTENT_TYPE_MUSIC}. */ public static final int AUDIO_CONTENT_TYPE_MUSIC = AudioAttributes.CONTENT_TYPE_MUSIC; + /** * @deprecated Use {@link #AUDIO_CONTENT_TYPE_MUSIC} instead. */ @UnstableApi @Deprecated public static final int CONTENT_TYPE_MUSIC = AUDIO_CONTENT_TYPE_MUSIC; + /** See {@link AudioAttributes#CONTENT_TYPE_SONIFICATION}. */ public static final int AUDIO_CONTENT_TYPE_SONIFICATION = AudioAttributes.CONTENT_TYPE_SONIFICATION; + /** * @deprecated Use {@link #AUDIO_CONTENT_TYPE_SONIFICATION} instead. */ @UnstableApi @Deprecated public static final int CONTENT_TYPE_SONIFICATION = AUDIO_CONTENT_TYPE_SONIFICATION; + /** See {@link AudioAttributes#CONTENT_TYPE_SPEECH}. */ public static final int AUDIO_CONTENT_TYPE_SPEECH = AudioAttributes.CONTENT_TYPE_SPEECH; + /** * @deprecated Use {@link #AUDIO_CONTENT_TYPE_SPEECH} instead. */ @UnstableApi @Deprecated public static final int CONTENT_TYPE_SPEECH = AUDIO_CONTENT_TYPE_SPEECH; + /** See {@link AudioAttributes#CONTENT_TYPE_UNKNOWN}. */ public static final int AUDIO_CONTENT_TYPE_UNKNOWN = AudioAttributes.CONTENT_TYPE_UNKNOWN; + /** * @deprecated Use {@link #AUDIO_CONTENT_TYPE_UNKNOWN} instead. */ @@ -426,6 +480,7 @@ public final class C { flag = true, value = {FLAG_AUDIBILITY_ENFORCED}) public @interface AudioFlags {} + /** See {@link android.media.AudioAttributes#FLAG_AUDIBILITY_ENFORCED}. */ public static final int FLAG_AUDIBILITY_ENFORCED = android.media.AudioAttributes.FLAG_AUDIBILITY_ENFORCED; @@ -464,45 +519,61 @@ public final class C { USAGE_VOICE_COMMUNICATION_SIGNALLING }) public @interface AudioUsage {} + /** See {@link android.media.AudioAttributes#USAGE_ALARM}. */ public static final int USAGE_ALARM = android.media.AudioAttributes.USAGE_ALARM; + /** See {@link android.media.AudioAttributes#USAGE_ASSISTANCE_ACCESSIBILITY}. */ public static final int USAGE_ASSISTANCE_ACCESSIBILITY = android.media.AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY; + /** See {@link android.media.AudioAttributes#USAGE_ASSISTANCE_NAVIGATION_GUIDANCE}. */ public static final int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = android.media.AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE; + /** See {@link android.media.AudioAttributes#USAGE_ASSISTANCE_SONIFICATION}. */ public static final int USAGE_ASSISTANCE_SONIFICATION = android.media.AudioAttributes.USAGE_ASSISTANCE_SONIFICATION; + /** See {@link android.media.AudioAttributes#USAGE_ASSISTANT}. */ public static final int USAGE_ASSISTANT = android.media.AudioAttributes.USAGE_ASSISTANT; + /** See {@link android.media.AudioAttributes#USAGE_GAME}. */ public static final int USAGE_GAME = android.media.AudioAttributes.USAGE_GAME; + /** See {@link android.media.AudioAttributes#USAGE_MEDIA}. */ public static final int USAGE_MEDIA = android.media.AudioAttributes.USAGE_MEDIA; + /** See {@link android.media.AudioAttributes#USAGE_NOTIFICATION}. */ public static final int USAGE_NOTIFICATION = android.media.AudioAttributes.USAGE_NOTIFICATION; + /** See {@link android.media.AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_DELAYED}. */ public static final int USAGE_NOTIFICATION_COMMUNICATION_DELAYED = android.media.AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_DELAYED; + /** See {@link android.media.AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_INSTANT}. */ public static final int USAGE_NOTIFICATION_COMMUNICATION_INSTANT = android.media.AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_INSTANT; + /** See {@link android.media.AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_REQUEST}. */ public static final int USAGE_NOTIFICATION_COMMUNICATION_REQUEST = android.media.AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_REQUEST; + /** See {@link android.media.AudioAttributes#USAGE_NOTIFICATION_EVENT}. */ public static final int USAGE_NOTIFICATION_EVENT = android.media.AudioAttributes.USAGE_NOTIFICATION_EVENT; + /** See {@link android.media.AudioAttributes#USAGE_NOTIFICATION_RINGTONE}. */ public static final int USAGE_NOTIFICATION_RINGTONE = android.media.AudioAttributes.USAGE_NOTIFICATION_RINGTONE; + /** See {@link android.media.AudioAttributes#USAGE_UNKNOWN}. */ public static final int USAGE_UNKNOWN = android.media.AudioAttributes.USAGE_UNKNOWN; + /** See {@link android.media.AudioAttributes#USAGE_VOICE_COMMUNICATION}. */ public static final int USAGE_VOICE_COMMUNICATION = android.media.AudioAttributes.USAGE_VOICE_COMMUNICATION; + /** See {@link android.media.AudioAttributes#USAGE_VOICE_COMMUNICATION_SIGNALLING}. */ public static final int USAGE_VOICE_COMMUNICATION_SIGNALLING = android.media.AudioAttributes.USAGE_VOICE_COMMUNICATION_SIGNALLING; @@ -518,10 +589,13 @@ public final class C { @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({ALLOW_CAPTURE_BY_ALL, ALLOW_CAPTURE_BY_NONE, ALLOW_CAPTURE_BY_SYSTEM}) public @interface AudioAllowedCapturePolicy {} + /** See {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_ALL}. */ public static final int ALLOW_CAPTURE_BY_ALL = AudioAttributes.ALLOW_CAPTURE_BY_ALL; + /** See {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_NONE}. */ public static final int ALLOW_CAPTURE_BY_NONE = AudioAttributes.ALLOW_CAPTURE_BY_NONE; + /** See {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_SYSTEM}. */ public static final int ALLOW_CAPTURE_BY_SYSTEM = AudioAttributes.ALLOW_CAPTURE_BY_SYSTEM; @@ -547,19 +621,26 @@ public final class C { BUFFER_FLAG_DECODE_ONLY }) public @interface BufferFlags {} + /** Indicates that a buffer holds a synchronization sample. */ @UnstableApi public static final int BUFFER_FLAG_KEY_FRAME = MediaCodec.BUFFER_FLAG_KEY_FRAME; + /** Flag for empty buffers that signal that the end of the stream was reached. */ @UnstableApi public static final int BUFFER_FLAG_END_OF_STREAM = MediaCodec.BUFFER_FLAG_END_OF_STREAM; + /** Indicates that a buffer is known to contain the first media sample of the stream. */ @UnstableApi public static final int BUFFER_FLAG_FIRST_SAMPLE = 1 << 27; // 0x08000000 + /** Indicates that a buffer has supplemental data. */ @UnstableApi public static final int BUFFER_FLAG_HAS_SUPPLEMENTAL_DATA = 1 << 28; // 0x10000000 + /** Indicates that a buffer is known to contain the last media sample of the stream. */ @UnstableApi public static final int BUFFER_FLAG_LAST_SAMPLE = 1 << 29; // 0x20000000 + /** Indicates that a buffer is (at least partially) encrypted. */ @UnstableApi public static final int BUFFER_FLAG_ENCRYPTED = 1 << 30; // 0x40000000 + /** Indicates that a buffer should be decoded but not rendered. */ @UnstableApi public static final int BUFFER_FLAG_DECODE_ONLY = 1 << 31; // 0x80000000 @@ -573,10 +654,13 @@ public final class C { @Target(TYPE_USE) @IntDef(value = {VIDEO_OUTPUT_MODE_NONE, VIDEO_OUTPUT_MODE_YUV, VIDEO_OUTPUT_MODE_SURFACE_YUV}) public @interface VideoOutputMode {} + /** Video decoder output mode is not set. */ @UnstableApi public static final int VIDEO_OUTPUT_MODE_NONE = -1; + /** Video decoder output mode that outputs raw 4:2:0 YUV planes. */ @UnstableApi public static final int VIDEO_OUTPUT_MODE_YUV = 0; + /** Video decoder output mode that renders 4:2:0 YUV planes directly to a surface. */ @UnstableApi public static final int VIDEO_OUTPUT_MODE_SURFACE_YUV = 1; @@ -598,14 +682,17 @@ public final class C { VIDEO_SCALING_MODE_DEFAULT }) public @interface VideoScalingMode {} + /** See {@link MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT}. */ @UnstableApi public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT = MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT; + /** See {@link MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}. */ @UnstableApi public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING = MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING; + /** A default video scaling mode for {@link MediaCodec}-based renderers. */ @UnstableApi public static final int VIDEO_SCALING_MODE_DEFAULT = VIDEO_SCALING_MODE_SCALE_TO_FIT; @@ -618,11 +705,13 @@ public final class C { @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF, VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS}) public @interface VideoChangeFrameRateStrategy {} + /** * Strategy to never call {@link Surface#setFrameRate}. Use this strategy if you prefer to call * {@link Surface#setFrameRate} directly from application code. */ @UnstableApi public static final int VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF = Integer.MIN_VALUE; + /** * Strategy to call {@link Surface#setFrameRate} with {@link * Surface#CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS} when the output frame rate is known. @@ -644,9 +733,11 @@ public final class C { flag = true, value = {SELECTION_FLAG_DEFAULT, SELECTION_FLAG_FORCED, SELECTION_FLAG_AUTOSELECT}) public @interface SelectionFlags {} + // LINT.IfChange(selection_flags) /** Indicates that the track should be selected if user preferences do not state otherwise. */ public static final int SELECTION_FLAG_DEFAULT = 1; + /** * Indicates that the track should be selected if its language matches the language of the * selected audio track and user preferences do not state otherwise. Only applies to text tracks. @@ -657,6 +748,7 @@ public final class C { * for more info. */ public static final int SELECTION_FLAG_FORCED = 1 << 1; // 2 + /** * Indicates that the player may choose to play the track in absence of an explicit user * preference. @@ -690,32 +782,42 @@ public final class C { CONTENT_TYPE_OTHER }) public @interface ContentType {} + /** Value representing a DASH manifest. */ public static final int CONTENT_TYPE_DASH = 0; + /** * @deprecated Use {@link #CONTENT_TYPE_DASH} instead. */ @Deprecated @UnstableApi public static final int TYPE_DASH = CONTENT_TYPE_DASH; + /** Value representing a Smooth Streaming manifest. */ public static final int CONTENT_TYPE_SS = 1; + /** * @deprecated Use {@link #CONTENT_TYPE_SS} instead. */ @Deprecated @UnstableApi public static final int TYPE_SS = CONTENT_TYPE_SS; + /** Value representing an HLS manifest. */ public static final int CONTENT_TYPE_HLS = 2; + /** * @deprecated Use {@link #CONTENT_TYPE_HLS} instead. */ @Deprecated @UnstableApi public static final int TYPE_HLS = CONTENT_TYPE_HLS; + /** Value representing an RTSP stream. */ public static final int CONTENT_TYPE_RTSP = 3; + /** * @deprecated Use {@link #CONTENT_TYPE_RTSP} instead. */ @Deprecated @UnstableApi public static final int TYPE_RTSP = CONTENT_TYPE_RTSP; + /** Value representing files other than DASH, HLS or Smooth Streaming manifests, or RTSP URIs. */ public static final int CONTENT_TYPE_OTHER = 4; + /** * @deprecated Use {@link #CONTENT_TYPE_OTHER} instead. */ @@ -723,14 +825,18 @@ public final class C { /** A return value for methods where the end of an input was encountered. */ @UnstableApi public static final int RESULT_END_OF_INPUT = -1; + /** * A return value for methods where the length of parsed data exceeds the maximum length allowed. */ @UnstableApi public static final int RESULT_MAX_LENGTH_EXCEEDED = -2; + /** A return value for methods where nothing was read. */ @UnstableApi public static final int RESULT_NOTHING_READ = -3; + /** A return value for methods where a buffer was read. */ @UnstableApi public static final int RESULT_BUFFER_READ = -4; + /** A return value for methods where a format was read. */ @UnstableApi public static final int RESULT_FORMAT_READ = -5; @@ -758,24 +864,33 @@ public final class C { DATA_TYPE_MEDIA_PROGRESSIVE_LIVE }) public @interface DataType {} + /** A data type constant for data of unknown or unspecified type. */ @UnstableApi public static final int DATA_TYPE_UNKNOWN = 0; + /** A data type constant for media, typically containing media samples. */ @UnstableApi public static final int DATA_TYPE_MEDIA = 1; + /** A data type constant for media, typically containing only initialization data. */ @UnstableApi public static final int DATA_TYPE_MEDIA_INITIALIZATION = 2; + /** A data type constant for drm or encryption data. */ @UnstableApi public static final int DATA_TYPE_DRM = 3; + /** A data type constant for a manifest file. */ @UnstableApi public static final int DATA_TYPE_MANIFEST = 4; + /** A data type constant for time synchronization data. */ @UnstableApi public static final int DATA_TYPE_TIME_SYNCHRONIZATION = 5; + /** A data type constant for ads loader data. */ @UnstableApi public static final int DATA_TYPE_AD = 6; + /** * A data type constant for live progressive media streams, typically containing media samples. */ @UnstableApi public static final int DATA_TYPE_MEDIA_PROGRESSIVE_LIVE = 7; + /** * Applications or extensions may define custom {@code DATA_TYPE_*} constants greater than or * equal to this value. @@ -806,24 +921,34 @@ public final class C { TRACK_TYPE_NONE, }) public @interface TrackType {} + /** A type constant for a fake or empty track. */ public static final int TRACK_TYPE_NONE = -2; + /** A type constant for tracks of unknown type. */ public static final int TRACK_TYPE_UNKNOWN = -1; + /** A type constant for tracks of some default type, where the type itself is unknown. */ public static final int TRACK_TYPE_DEFAULT = 0; + /** A type constant for audio tracks. */ public static final int TRACK_TYPE_AUDIO = 1; + /** A type constant for video tracks. */ public static final int TRACK_TYPE_VIDEO = 2; + /** A type constant for text tracks. */ public static final int TRACK_TYPE_TEXT = 3; + /** A type constant for image tracks. */ public static final int TRACK_TYPE_IMAGE = 4; + /** A type constant for metadata tracks. */ public static final int TRACK_TYPE_METADATA = 5; + /** A type constant for camera motion tracks. */ public static final int TRACK_TYPE_CAMERA_MOTION = 6; + /** * Applications or extensions may define custom {@code TRACK_TYPE_*} constants greater than or * equal to this value. @@ -850,16 +975,22 @@ public final class C { SELECTION_REASON_TRICK_PLAY }) public @interface SelectionReason {} + /** A selection reason constant for selections whose reasons are unknown or unspecified. */ @UnstableApi public static final int SELECTION_REASON_UNKNOWN = 0; + /** A selection reason constant for an initial track selection. */ @UnstableApi public static final int SELECTION_REASON_INITIAL = 1; + /** A selection reason constant for an manual (i.e. user initiated) track selection. */ @UnstableApi public static final int SELECTION_REASON_MANUAL = 2; + /** A selection reason constant for an adaptive track selection. */ @UnstableApi public static final int SELECTION_REASON_ADAPTIVE = 3; + /** A selection reason constant for a trick play track selection. */ @UnstableApi public static final int SELECTION_REASON_TRICK_PLAY = 4; + /** * Applications or extensions may define custom {@code SELECTION_REASON_*} constants greater than * or equal to this value. @@ -871,6 +1002,7 @@ public final class C { /** A default seek back increment, in milliseconds. */ public static final long DEFAULT_SEEK_BACK_INCREMENT_MS = 5_000; + /** A default seek forward increment, in milliseconds. */ public static final long DEFAULT_SEEK_FORWARD_INCREMENT_MS = 15_000; @@ -952,12 +1084,16 @@ public final class C { STEREO_MODE_STEREO_MESH }) public @interface StereoMode {} + /** Indicates Monoscopic stereo layout, used with 360/3D/VR videos. */ @UnstableApi public static final int STEREO_MODE_MONO = 0; + /** Indicates Top-Bottom stereo layout, used with 360/3D/VR videos. */ @UnstableApi public static final int STEREO_MODE_TOP_BOTTOM = 1; + /** Indicates Left-Right stereo layout, used with 360/3D/VR videos. */ @UnstableApi public static final int STEREO_MODE_LEFT_RIGHT = 2; + /** * Indicates a stereo layout where the left and right eyes have separate meshes, used with * 360/3D/VR videos. @@ -975,10 +1111,13 @@ public final class C { @Target(TYPE_USE) @IntDef({Format.NO_VALUE, COLOR_SPACE_BT601, COLOR_SPACE_BT709, COLOR_SPACE_BT2020}) public @interface ColorSpace {} + /** See {@link MediaFormat#COLOR_STANDARD_BT601_PAL}. */ @UnstableApi public static final int COLOR_SPACE_BT601 = MediaFormat.COLOR_STANDARD_BT601_PAL; + /** See {@link MediaFormat#COLOR_STANDARD_BT709}. */ @UnstableApi public static final int COLOR_SPACE_BT709 = MediaFormat.COLOR_STANDARD_BT709; + /** See {@link MediaFormat#COLOR_STANDARD_BT2020}. */ @UnstableApi public static final int COLOR_SPACE_BT2020 = MediaFormat.COLOR_STANDARD_BT2020; @@ -1002,10 +1141,13 @@ public final class C { COLOR_TRANSFER_HLG }) public @interface ColorTransfer {} + /** See {@link MediaFormat#COLOR_TRANSFER_LINEAR}. */ @UnstableApi public static final int COLOR_TRANSFER_LINEAR = MediaFormat.COLOR_TRANSFER_LINEAR; + /** See {@link MediaFormat#COLOR_TRANSFER_SDR_VIDEO}. The SMPTE 170M transfer function. */ @UnstableApi public static final int COLOR_TRANSFER_SDR = MediaFormat.COLOR_TRANSFER_SDR_VIDEO; + /** * See {@link android.hardware.DataSpace#TRANSFER_SRGB}. The standard RGB transfer function, used * for some SDR use-cases like image input. @@ -1013,13 +1155,16 @@ public final class C { // Value sourced from ordering here: // https://cs.android.com/android/platform/superproject/+/master:frameworks/native/headers/media_plugin/media/hardware/VideoAPI.h;drc=55e9bd7c487ee235631f302ab8626776547ac913;l=138. @UnstableApi public static final int COLOR_TRANSFER_SRGB = 2; + /** * See {@link android.hardware.DataSpace#TRANSFER_GAMMA2_2}. The Gamma 2.2 transfer function, used * for some SDR use-cases like tone-mapping. */ @UnstableApi public static final int COLOR_TRANSFER_GAMMA_2_2 = 10; + /** See {@link MediaFormat#COLOR_TRANSFER_ST2084}. */ @UnstableApi public static final int COLOR_TRANSFER_ST2084 = MediaFormat.COLOR_TRANSFER_ST2084; + /** See {@link MediaFormat#COLOR_TRANSFER_HLG}. */ @UnstableApi public static final int COLOR_TRANSFER_HLG = MediaFormat.COLOR_TRANSFER_HLG; @@ -1034,8 +1179,10 @@ public final class C { @Target(TYPE_USE) @IntDef({Format.NO_VALUE, COLOR_RANGE_LIMITED, COLOR_RANGE_FULL}) public @interface ColorRange {} + /** See {@link MediaFormat#COLOR_RANGE_LIMITED}. */ @UnstableApi public static final int COLOR_RANGE_LIMITED = MediaFormat.COLOR_RANGE_LIMITED; + /** See {@link MediaFormat#COLOR_RANGE_FULL}. */ @UnstableApi public static final int COLOR_RANGE_FULL = MediaFormat.COLOR_RANGE_FULL; @@ -1052,12 +1199,16 @@ public final class C { PROJECTION_MESH }) public @interface Projection {} + /** Conventional rectangular projection. */ @UnstableApi public static final int PROJECTION_RECTANGULAR = 0; + /** Equirectangular spherical projection. */ @UnstableApi public static final int PROJECTION_EQUIRECTANGULAR = 1; + /** Cube map projection. */ @UnstableApi public static final int PROJECTION_CUBEMAP = 2; + /** 3-D mesh projection. */ @UnstableApi public static final int PROJECTION_MESH = 3; @@ -1101,29 +1252,40 @@ public final class C { NETWORK_TYPE_OTHER }) public @interface NetworkType {} + /** Unknown network type. */ @UnstableApi public static final int NETWORK_TYPE_UNKNOWN = 0; + /** No network connection. */ @UnstableApi public static final int NETWORK_TYPE_OFFLINE = 1; + /** Network type for a Wifi connection. */ @UnstableApi public static final int NETWORK_TYPE_WIFI = 2; + /** Network type for a 2G cellular connection. */ @UnstableApi public static final int NETWORK_TYPE_2G = 3; + /** Network type for a 3G cellular connection. */ @UnstableApi public static final int NETWORK_TYPE_3G = 4; + /** Network type for a 4G cellular connection. */ @UnstableApi public static final int NETWORK_TYPE_4G = 5; + /** Network type for a 5G stand-alone (SA) cellular connection. */ @UnstableApi public static final int NETWORK_TYPE_5G_SA = 9; + /** Network type for a 5G non-stand-alone (NSA) cellular connection. */ @UnstableApi public static final int NETWORK_TYPE_5G_NSA = 10; + /** * Network type for cellular connections which cannot be mapped to one of {@link * #NETWORK_TYPE_2G}, {@link #NETWORK_TYPE_3G}, or {@link #NETWORK_TYPE_4G}. */ @UnstableApi public static final int NETWORK_TYPE_CELLULAR_UNKNOWN = 6; + /** Network type for an Ethernet connection. */ @UnstableApi public static final int NETWORK_TYPE_ETHERNET = 7; + /** Network type for other connections which are not Wifi or cellular (e.g. VPN, Bluetooth). */ @UnstableApi public static final int NETWORK_TYPE_OTHER = 8; @@ -1138,12 +1300,14 @@ public final class C { @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({WAKE_MODE_NONE, WAKE_MODE_LOCAL, WAKE_MODE_NETWORK}) public @interface WakeMode {} + /** * A wake mode that will not cause the player to hold any locks. * *

This is suitable for applications that do not play media with the screen off. */ public static final int WAKE_MODE_NONE = 0; + /** * A wake mode that will cause the player to hold a {@link android.os.PowerManager.WakeLock} * during playback. @@ -1152,6 +1316,7 @@ public final class C { * over wifi. */ public static final int WAKE_MODE_LOCAL = 1; + /** * A wake mode that will cause the player to hold a {@link android.os.PowerManager.WakeLock} and a * {@link android.net.wifi.WifiManager.WifiLock} during playback. @@ -1195,50 +1360,65 @@ public final class C { ROLE_FLAG_TRICK_PLAY }) public @interface RoleFlags {} + // LINT.IfChange(role_flags) /** Indicates a main track. */ public static final int ROLE_FLAG_MAIN = 1; + /** * Indicates an alternate track. For example a video track recorded from an different view point * than the main track(s). */ public static final int ROLE_FLAG_ALTERNATE = 1 << 1; + /** * Indicates a supplementary track, meaning the track has lower importance than the main track(s). * For example a video track that provides a visual accompaniment to a main audio track. */ public static final int ROLE_FLAG_SUPPLEMENTARY = 1 << 2; + /** Indicates the track contains commentary, for example from the director. */ public static final int ROLE_FLAG_COMMENTARY = 1 << 3; + /** * Indicates the track is in a different language from the original, for example dubbed audio or * translated captions. */ public static final int ROLE_FLAG_DUB = 1 << 4; + /** Indicates the track contains information about a current emergency. */ public static final int ROLE_FLAG_EMERGENCY = 1 << 5; + /** * Indicates the track contains captions. This flag may be set on video tracks to indicate the * presence of burned in captions. */ public static final int ROLE_FLAG_CAPTION = 1 << 6; + /** * Indicates the track contains subtitles. This flag may be set on video tracks to indicate the * presence of burned in subtitles. */ public static final int ROLE_FLAG_SUBTITLE = 1 << 7; + /** Indicates the track contains a visual sign-language interpretation of an audio track. */ public static final int ROLE_FLAG_SIGN = 1 << 8; + /** Indicates the track contains an audio or textual description of a video track. */ public static final int ROLE_FLAG_DESCRIBES_VIDEO = 1 << 9; + /** Indicates the track contains a textual description of music and sound. */ public static final int ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND = 1 << 10; + /** Indicates the track is designed for improved intelligibility of dialogue. */ public static final int ROLE_FLAG_ENHANCED_DIALOG_INTELLIGIBILITY = 1 << 11; + /** Indicates the track contains a transcription of spoken dialog. */ public static final int ROLE_FLAG_TRANSCRIBES_DIALOG = 1 << 12; + /** Indicates the track contains a text that has been edited for ease of reading. */ public static final int ROLE_FLAG_EASY_TO_READ = 1 << 13; + /** Indicates the track is intended for trick play. */ public static final int ROLE_FLAG_TRICK_PLAY = 1 << 14; @@ -1261,9 +1441,11 @@ public final class C { FORMAT_UNSUPPORTED_TYPE }) public @interface FormatSupport {} + // TODO(b/172315872) Renderer was a link. Link to equivalent concept or remove @code. /** The {@code Renderer} is capable of rendering the format. */ @UnstableApi public static final int FORMAT_HANDLED = 0b100; + /** * The {@code Renderer} is capable of rendering formats with the same MIME type, but the * properties of the format exceed the renderer's capabilities. There is a chance the renderer @@ -1275,6 +1457,7 @@ public final class C { * by the underlying H264 decoder. */ @UnstableApi public static final int FORMAT_EXCEEDS_CAPABILITIES = 0b011; + /** * The {@code Renderer} is capable of rendering formats with the same MIME type, but is not * capable of rendering the format because the format's drm protection is not supported. @@ -1284,6 +1467,7 @@ public final class C { * renderer only supports Widevine. */ @UnstableApi public static final int FORMAT_UNSUPPORTED_DRM = 0b010; + /** * The {@code Renderer} is a general purpose renderer for formats of the same top-level type, but * is not capable of rendering the format or any other format with the same MIME type because the @@ -1293,6 +1477,7 @@ public final class C { * matches audio/[subtype], but there does not exist a suitable decoder for [subtype]. */ @UnstableApi public static final int FORMAT_UNSUPPORTED_SUBTYPE = 0b001; + /** * The {@code Renderer} is not capable of rendering the format, either because it does not support * the format's top-level type, or because it's a specialized renderer for a different MIME type. diff --git a/libraries/common/src/main/java/androidx/media3/common/DeviceInfo.java b/libraries/common/src/main/java/androidx/media3/common/DeviceInfo.java index 62daf34a41..96607a9dd4 100644 --- a/libraries/common/src/main/java/androidx/media3/common/DeviceInfo.java +++ b/libraries/common/src/main/java/androidx/media3/common/DeviceInfo.java @@ -43,8 +43,10 @@ public final class DeviceInfo implements Bundleable { PLAYBACK_TYPE_REMOTE, }) public @interface PlaybackType {} + /** Playback happens on the local device (e.g. phone). */ public static final int PLAYBACK_TYPE_LOCAL = 0; + /** Playback happens outside of the device (e.g. a cast device). */ public static final int PLAYBACK_TYPE_REMOTE = 1; @@ -126,12 +128,15 @@ public final class DeviceInfo implements Bundleable { /** The type of playback. */ public final @PlaybackType int playbackType; + /** The minimum volume that the device supports. */ @IntRange(from = 0) public final int minVolume; + /** The maximum volume that the device supports, or {@code 0} if unspecified. */ @IntRange(from = 0) public final int maxVolume; + /** * The {@linkplain MediaRouter2.RoutingController#getId() routing controller id} of the associated * {@link MediaRouter2.RoutingController}, or null if unset or {@link #playbackType} is {@link diff --git a/libraries/common/src/main/java/androidx/media3/common/DrmInitData.java b/libraries/common/src/main/java/androidx/media3/common/DrmInitData.java index 65fe095828..4f942fa739 100644 --- a/libraries/common/src/main/java/androidx/media3/common/DrmInitData.java +++ b/libraries/common/src/main/java/androidx/media3/common/DrmInitData.java @@ -265,10 +265,13 @@ public final class DrmInitData implements Comparator, Parcelable { * applies to all schemes). */ public final UUID uuid; + /** The URL of the server to which license requests should be made. May be null if unknown. */ @Nullable public final String licenseServerUrl; + /** The mimeType of {@link #data}. */ public final String mimeType; + /** The initialization data. May be null for scheme support checks only. */ @Nullable public final byte[] data; diff --git a/libraries/common/src/main/java/androidx/media3/common/FileTypes.java b/libraries/common/src/main/java/androidx/media3/common/FileTypes.java index b4cd6c7497..ab06a48b89 100644 --- a/libraries/common/src/main/java/androidx/media3/common/FileTypes.java +++ b/libraries/common/src/main/java/androidx/media3/common/FileTypes.java @@ -47,40 +47,58 @@ public final class FileTypes { MIDI, AVI }) public @interface Type {} + /** Unknown file type. */ public static final int UNKNOWN = -1; + /** File type for the AC-3 and E-AC-3 formats. */ public static final int AC3 = 0; + /** File type for the AC-4 format. */ public static final int AC4 = 1; + /** File type for the ADTS format. */ public static final int ADTS = 2; + /** File type for the AMR format. */ public static final int AMR = 3; + /** File type for the FLAC format. */ public static final int FLAC = 4; + /** File type for the FLV format. */ public static final int FLV = 5; + /** File type for the Matroska and WebM formats. */ public static final int MATROSKA = 6; + /** File type for the MP3 format. */ public static final int MP3 = 7; + /** File type for the MP4 format. */ public static final int MP4 = 8; + /** File type for the Ogg format. */ public static final int OGG = 9; + /** File type for the MPEG-PS format. */ public static final int PS = 10; + /** File type for the MPEG-TS format. */ public static final int TS = 11; + /** File type for the WAV format. */ public static final int WAV = 12; + /** File type for the WebVTT format. */ public static final int WEBVTT = 13; + /** File type for the JPEG format. */ public static final int JPEG = 14; + /** File type for the MIDI format. */ public static final int MIDI = 15; + /** File type for the AVI format. */ public static final int AVI = 16; diff --git a/libraries/common/src/main/java/androidx/media3/common/Format.java b/libraries/common/src/main/java/androidx/media3/common/Format.java index d9e50851fd..3d440c5bd2 100644 --- a/libraries/common/src/main/java/androidx/media3/common/Format.java +++ b/libraries/common/src/main/java/androidx/media3/common/Format.java @@ -686,14 +686,19 @@ public final class Format implements Bundleable { /** An identifier for the format, or null if unknown or not applicable. */ @Nullable public final String id; + /** The human readable label, or null if unknown or not applicable. */ @Nullable public final String label; + /** The language as an IETF BCP 47 conformant tag, or null if unknown or not applicable. */ @Nullable public final String language; + /** Track selection flags. */ public final @C.SelectionFlags int selectionFlags; + /** Track role flags. */ public final @C.RoleFlags int roleFlags; + /** * The average bitrate in bits per second, or {@link #NO_VALUE} if unknown or not applicable. The * way in which this field is populated depends on the type of media to which the format @@ -716,6 +721,7 @@ public final class Format implements Bundleable { * */ @UnstableApi public final int averageBitrate; + /** * The peak bitrate in bits per second, or {@link #NO_VALUE} if unknown or not applicable. The way * in which this field is populated depends on the type of media to which the format corresponds: @@ -735,14 +741,17 @@ public final class Format implements Bundleable { * */ @UnstableApi public final int peakBitrate; + /** * The bitrate in bits per second. This is the peak bitrate if known, or else the average bitrate * if known, or else {@link Format#NO_VALUE}. Equivalent to: {@code peakBitrate != NO_VALUE ? * peakBitrate : averageBitrate}. */ @UnstableApi public final int bitrate; + /** Codecs of the format as described in RFC 6381, or null if unknown or not applicable. */ @Nullable public final String codecs; + /** Metadata, or null if unknown or not applicable. */ @UnstableApi @Nullable public final Metadata metadata; @@ -755,16 +764,19 @@ public final class Format implements Bundleable { /** The sample MIME type, or null if unknown or not applicable. */ @Nullable public final String sampleMimeType; + /** * The maximum size of a buffer of data (typically one sample), or {@link #NO_VALUE} if unknown or * not applicable. */ @UnstableApi public final int maxInputSize; + /** * Initialization data that must be provided to the decoder. Will not be null, but may be empty if * initialization data is not required. */ @UnstableApi public final List initializationData; + /** DRM initialization data if the stream is protected, or null otherwise. */ @UnstableApi @Nullable public final DrmInitData drmInitData; @@ -779,25 +791,32 @@ public final class Format implements Bundleable { /** The width of the video in pixels, or {@link #NO_VALUE} if unknown or not applicable. */ public final int width; + /** The height of the video in pixels, or {@link #NO_VALUE} if unknown or not applicable. */ public final int height; + /** The frame rate in frames per second, or {@link #NO_VALUE} if unknown or not applicable. */ public final float frameRate; + /** * The clockwise rotation that should be applied to the video for it to be rendered in the correct * orientation, or 0 if unknown or not applicable. Only 0, 90, 180 and 270 are supported. */ @UnstableApi public final int rotationDegrees; + /** The width to height ratio of pixels in the video, or 1.0 if unknown or not applicable. */ public final float pixelWidthHeightRatio; + /** The projection data for 360/VR video, or null if not applicable. */ @UnstableApi @Nullable public final byte[] projectionData; + /** * The stereo layout for 360/3D/VR video, or {@link #NO_VALUE} if not applicable. Valid stereo * modes are {@link C#STEREO_MODE_MONO}, {@link C#STEREO_MODE_TOP_BOTTOM}, {@link * C#STEREO_MODE_LEFT_RIGHT}, {@link C#STEREO_MODE_STEREO_MESH}. */ @UnstableApi public final @C.StereoMode int stereoMode; + /** The color metadata associated with the video, or null if not applicable. */ @UnstableApi @Nullable public final ColorInfo colorInfo; @@ -805,15 +824,19 @@ public final class Format implements Bundleable { /** The number of audio channels, or {@link #NO_VALUE} if unknown or not applicable. */ public final int channelCount; + /** The audio sampling rate in Hz, or {@link #NO_VALUE} if unknown or not applicable. */ public final int sampleRate; + /** The {@link C.PcmEncoding} for PCM audio. Set to {@link #NO_VALUE} for other media types. */ @UnstableApi public final @C.PcmEncoding int pcmEncoding; + /** * The number of frames to trim from the start of the decoded audio stream, or 0 if not * applicable. */ @UnstableApi public final int encoderDelay; + /** * The number of frames to trim from the end of the decoded audio stream, or 0 if not applicable. */ @@ -830,6 +853,7 @@ public final class Format implements Bundleable { * The number of horizontal tiles in an image, or {@link #NO_VALUE} if not known or applicable. */ @UnstableApi public final int tileCountHorizontal; + /** The number of vertical tiles in an image, or {@link #NO_VALUE} if not known or applicable. */ @UnstableApi public final int tileCountVertical; diff --git a/libraries/common/src/main/java/androidx/media3/common/FrameInfo.java b/libraries/common/src/main/java/androidx/media3/common/FrameInfo.java index 2e3fdf91b9..b8589e0118 100644 --- a/libraries/common/src/main/java/androidx/media3/common/FrameInfo.java +++ b/libraries/common/src/main/java/androidx/media3/common/FrameInfo.java @@ -97,10 +97,13 @@ public class FrameInfo { /** The width of the frame, in pixels. */ public final int width; + /** The height of the frame, in pixels. */ public final int height; + /** The ratio of width over height for each pixel. */ public final float pixelWidthHeightRatio; + /** * The offset that must be added to the frame presentation timestamp, in microseconds. * diff --git a/libraries/common/src/main/java/androidx/media3/common/IllegalSeekPositionException.java b/libraries/common/src/main/java/androidx/media3/common/IllegalSeekPositionException.java index 00b204fcc5..55ceb31861 100644 --- a/libraries/common/src/main/java/androidx/media3/common/IllegalSeekPositionException.java +++ b/libraries/common/src/main/java/androidx/media3/common/IllegalSeekPositionException.java @@ -26,8 +26,10 @@ public final class IllegalSeekPositionException extends IllegalStateException { /** The {@link Timeline} in which the seek was attempted. */ public final Timeline timeline; + /** The index of the window being seeked to. */ public final int windowIndex; + /** The seek position in the specified window. */ public final long positionMs; diff --git a/libraries/common/src/main/java/androidx/media3/common/MediaItem.java b/libraries/common/src/main/java/androidx/media3/common/MediaItem.java index f9868881df..cb0174f778 100644 --- a/libraries/common/src/main/java/androidx/media3/common/MediaItem.java +++ b/libraries/common/src/main/java/androidx/media3/common/MediaItem.java @@ -818,6 +818,7 @@ public final class MediaItem implements Bundleable { * @deprecated Use {@link #forcedSessionTrackTypes}. */ @UnstableApi @Deprecated public final ImmutableList<@C.TrackType Integer> sessionForClearTypes; + /** * The types of tracks for which to always use a DRM session even if the content is unencrypted. */ @@ -1114,6 +1115,7 @@ public final class MediaItem implements Bundleable { /** Optional subtitles to be sideloaded. */ public final ImmutableList subtitleConfigurations; + /** * @deprecated Use {@link #subtitleConfigurations} instead. */ @@ -1593,16 +1595,22 @@ public final class MediaItem implements Bundleable { /** The {@link Uri} to the subtitle file. */ public final Uri uri; + /** The optional MIME type of the subtitle file, or {@code null} if unspecified. */ @Nullable public final String mimeType; + /** The language. */ @Nullable public final String language; + /** The selection flags. */ public final @C.SelectionFlags int selectionFlags; + /** The role flags. */ public final @C.RoleFlags int roleFlags; + /** The label. */ @Nullable public final String label; + /** * The ID of the subtitles. This will be propagated to the {@link Format#id} of the subtitle * track created from this configuration. @@ -2165,6 +2173,7 @@ public final class MediaItem implements Bundleable { * boundaries. */ @Nullable public final LocalConfiguration localConfiguration; + /** * @deprecated Use {@link #localConfiguration} instead. */ @@ -2178,6 +2187,7 @@ public final class MediaItem implements Bundleable { /** The clipping properties. */ public final ClippingConfiguration clippingConfiguration; + /** * @deprecated Use {@link #clippingConfiguration} instead. */ diff --git a/libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java b/libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java index 9fb33087db..55070dc938 100644 --- a/libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java +++ b/libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java @@ -643,108 +643,143 @@ public final class MediaMetadata implements Bundleable { /** Media of undetermined type or a mix of multiple {@linkplain MediaType media types}. */ public static final int MEDIA_TYPE_MIXED = 0; + /** {@link MediaType} for music. */ public static final int MEDIA_TYPE_MUSIC = 1; + /** {@link MediaType} for an audio book chapter. */ public static final int MEDIA_TYPE_AUDIO_BOOK_CHAPTER = 2; + /** {@link MediaType} for a podcast episode. */ public static final int MEDIA_TYPE_PODCAST_EPISODE = 3; + /** {@link MediaType} for a radio station. */ public static final int MEDIA_TYPE_RADIO_STATION = 4; + /** {@link MediaType} for news. */ public static final int MEDIA_TYPE_NEWS = 5; + /** {@link MediaType} for a video. */ public static final int MEDIA_TYPE_VIDEO = 6; + /** {@link MediaType} for a movie trailer. */ public static final int MEDIA_TYPE_TRAILER = 7; + /** {@link MediaType} for a movie. */ public static final int MEDIA_TYPE_MOVIE = 8; + /** {@link MediaType} for a TV show. */ public static final int MEDIA_TYPE_TV_SHOW = 9; + /** * {@link MediaType} for a group of items (e.g., {@link #MEDIA_TYPE_MUSIC music}) belonging to an * album. */ public static final int MEDIA_TYPE_ALBUM = 10; + /** * {@link MediaType} for a group of items (e.g., {@link #MEDIA_TYPE_MUSIC music}) from the same * artist. */ public static final int MEDIA_TYPE_ARTIST = 11; + /** * {@link MediaType} for a group of items (e.g., {@link #MEDIA_TYPE_MUSIC music}) of the same * genre. */ public static final int MEDIA_TYPE_GENRE = 12; + /** * {@link MediaType} for a group of items (e.g., {@link #MEDIA_TYPE_MUSIC music}) forming a * playlist. */ public static final int MEDIA_TYPE_PLAYLIST = 13; + /** * {@link MediaType} for a group of items (e.g., {@link #MEDIA_TYPE_MUSIC music}) from the same * year. */ public static final int MEDIA_TYPE_YEAR = 14; + /** * {@link MediaType} for a group of items forming an audio book. Items in this group are typically * of type {@link #MEDIA_TYPE_AUDIO_BOOK_CHAPTER}. */ public static final int MEDIA_TYPE_AUDIO_BOOK = 15; + /** * {@link MediaType} for a group of items belonging to a podcast. Items in this group are * typically of type {@link #MEDIA_TYPE_PODCAST_EPISODE}. */ public static final int MEDIA_TYPE_PODCAST = 16; + /** * {@link MediaType} for a group of items that are part of a TV channel. Items in this group are * typically of type {@link #MEDIA_TYPE_TV_SHOW}, {@link #MEDIA_TYPE_TV_SERIES} or {@link * #MEDIA_TYPE_MOVIE}. */ public static final int MEDIA_TYPE_TV_CHANNEL = 17; + /** * {@link MediaType} for a group of items that are part of a TV series. Items in this group are * typically of type {@link #MEDIA_TYPE_TV_SHOW} or {@link #MEDIA_TYPE_TV_SEASON}. */ public static final int MEDIA_TYPE_TV_SERIES = 18; + /** * {@link MediaType} for a group of items that are part of a TV series. Items in this group are * typically of type {@link #MEDIA_TYPE_TV_SHOW}. */ public static final int MEDIA_TYPE_TV_SEASON = 19; + /** {@link MediaType} for a folder with mixed or undetermined content. */ public static final int MEDIA_TYPE_FOLDER_MIXED = 20; + /** {@link MediaType} for a folder containing {@linkplain #MEDIA_TYPE_ALBUM albums}. */ public static final int MEDIA_TYPE_FOLDER_ALBUMS = 21; + /** {@link MediaType} for a folder containing {@linkplain #FIELD_ARTIST artists}. */ public static final int MEDIA_TYPE_FOLDER_ARTISTS = 22; + /** {@link MediaType} for a folder containing {@linkplain #MEDIA_TYPE_GENRE genres}. */ public static final int MEDIA_TYPE_FOLDER_GENRES = 23; + /** {@link MediaType} for a folder containing {@linkplain #MEDIA_TYPE_PLAYLIST playlists}. */ public static final int MEDIA_TYPE_FOLDER_PLAYLISTS = 24; + /** {@link MediaType} for a folder containing {@linkplain #MEDIA_TYPE_YEAR years}. */ public static final int MEDIA_TYPE_FOLDER_YEARS = 25; + /** {@link MediaType} for a folder containing {@linkplain #MEDIA_TYPE_AUDIO_BOOK audio books}. */ public static final int MEDIA_TYPE_FOLDER_AUDIO_BOOKS = 26; + /** {@link MediaType} for a folder containing {@linkplain #MEDIA_TYPE_PODCAST podcasts}. */ public static final int MEDIA_TYPE_FOLDER_PODCASTS = 27; + /** {@link MediaType} for a folder containing {@linkplain #MEDIA_TYPE_TV_CHANNEL TV channels}. */ public static final int MEDIA_TYPE_FOLDER_TV_CHANNELS = 28; + /** {@link MediaType} for a folder containing {@linkplain #MEDIA_TYPE_TV_SERIES TV series}. */ public static final int MEDIA_TYPE_FOLDER_TV_SERIES = 29; + /** {@link MediaType} for a folder containing {@linkplain #MEDIA_TYPE_TV_SHOW TV shows}. */ public static final int MEDIA_TYPE_FOLDER_TV_SHOWS = 30; + /** * {@link MediaType} for a folder containing {@linkplain #MEDIA_TYPE_RADIO_STATION radio * stations}. */ public static final int MEDIA_TYPE_FOLDER_RADIO_STATIONS = 31; + /** {@link MediaType} for a folder containing {@linkplain #MEDIA_TYPE_NEWS news}. */ public static final int MEDIA_TYPE_FOLDER_NEWS = 32; + /** {@link MediaType} for a folder containing {@linkplain #MEDIA_TYPE_VIDEO videos}. */ public static final int MEDIA_TYPE_FOLDER_VIDEOS = 33; + /** {@link MediaType} for a folder containing {@linkplain #MEDIA_TYPE_TRAILER movie trailers}. */ public static final int MEDIA_TYPE_FOLDER_TRAILERS = 34; + /** {@link MediaType} for a folder containing {@linkplain #MEDIA_TYPE_MOVIE movies}. */ public static final int MEDIA_TYPE_FOLDER_MOVIES = 35; @@ -787,6 +822,7 @@ public final class MediaMetadata implements Bundleable { * @deprecated Use {@link #isBrowsable} set to false instead. */ @Deprecated public static final int FOLDER_TYPE_NONE = -1; + /** * Type for a folder containing media of mixed types. * @@ -794,12 +830,14 @@ public final class MediaMetadata implements Bundleable { * #MEDIA_TYPE_FOLDER_MIXED} instead. */ @Deprecated public static final int FOLDER_TYPE_MIXED = 0; + /** * Type for a folder containing only playable media. * * @deprecated Use {@link #isBrowsable} set to true instead. */ @Deprecated public static final int FOLDER_TYPE_TITLES = 1; + /** * Type for a folder containing media categorized by album. * @@ -807,6 +845,7 @@ public final class MediaMetadata implements Bundleable { * #MEDIA_TYPE_FOLDER_ALBUMS} instead. */ @Deprecated public static final int FOLDER_TYPE_ALBUMS = 2; + /** * Type for a folder containing media categorized by artist. * @@ -814,6 +853,7 @@ public final class MediaMetadata implements Bundleable { * #MEDIA_TYPE_FOLDER_ARTISTS} instead. */ @Deprecated public static final int FOLDER_TYPE_ARTISTS = 3; + /** * Type for a folder containing media categorized by genre. * @@ -821,6 +861,7 @@ public final class MediaMetadata implements Bundleable { * #MEDIA_TYPE_FOLDER_GENRES} instead. */ @Deprecated public static final int FOLDER_TYPE_GENRES = 4; + /** * Type for a folder containing a playlist. * @@ -828,6 +869,7 @@ public final class MediaMetadata implements Bundleable { * #MEDIA_TYPE_FOLDER_PLAYLISTS} instead. */ @Deprecated public static final int FOLDER_TYPE_PLAYLISTS = 5; + /** * Type for a folder containing media categorized by year. * @@ -910,36 +952,50 @@ public final class MediaMetadata implements Bundleable { /** Optional title. */ @Nullable public final CharSequence title; + /** Optional artist. */ @Nullable public final CharSequence artist; + /** Optional album title. */ @Nullable public final CharSequence albumTitle; + /** Optional album artist. */ @Nullable public final CharSequence albumArtist; + /** Optional display title. */ @Nullable public final CharSequence displayTitle; + /** * Optional subtitle. * *

This is the secondary title of the media, unrelated to closed captions. */ @Nullable public final CharSequence subtitle; + /** Optional description. */ @Nullable public final CharSequence description; + /** Optional user {@link Rating}. */ @Nullable public final Rating userRating; + /** Optional overall {@link Rating}. */ @Nullable public final Rating overallRating; + /** Optional artwork data as a compressed byte array. */ @Nullable public final byte[] artworkData; + /** Optional {@link PictureType} of the artwork data. */ @Nullable public final @PictureType Integer artworkDataType; + /** Optional artwork {@link Uri}. */ @Nullable public final Uri artworkUri; + /** Optional track number. */ @Nullable public final Integer trackNumber; + /** Optional total number of tracks. */ @Nullable public final Integer totalTrackCount; + /** * Optional {@link FolderType}. * @@ -950,22 +1006,28 @@ public final class MediaMetadata implements Bundleable { @Deprecated @Nullable public final @FolderType Integer folderType; + /** Optional boolean to indicate that the media is a browsable folder. */ @Nullable public final Boolean isBrowsable; + /** Optional boolean to indicate that the media is playable. */ @Nullable public final Boolean isPlayable; + /** * @deprecated Use {@link #recordingYear} instead. */ @UnstableApi @Deprecated @Nullable public final Integer year; + /** Optional year of the recording date. */ @Nullable public final Integer recordingYear; + /** * Optional month of the recording date. * *

Note that there is no guarantee that the month and day are a valid combination. */ @Nullable public final Integer recordingMonth; + /** * Optional day of the recording date. * @@ -975,34 +1037,45 @@ public final class MediaMetadata implements Bundleable { /** Optional year of the release date. */ @Nullable public final Integer releaseYear; + /** * Optional month of the release date. * *

Note that there is no guarantee that the month and day are a valid combination. */ @Nullable public final Integer releaseMonth; + /** * Optional day of the release date. * *

Note that there is no guarantee that the month and day are a valid combination. */ @Nullable public final Integer releaseDay; + /** Optional writer. */ @Nullable public final CharSequence writer; + /** Optional composer. */ @Nullable public final CharSequence composer; + /** Optional conductor. */ @Nullable public final CharSequence conductor; + /** Optional disc number. */ @Nullable public final Integer discNumber; + /** Optional total number of discs. */ @Nullable public final Integer totalDiscCount; + /** Optional genre. */ @Nullable public final CharSequence genre; + /** Optional compilation. */ @Nullable public final CharSequence compilation; + /** Optional name of the station streaming the media. */ @Nullable public final CharSequence station; + /** Optional {@link MediaType}. */ @Nullable public final @MediaType Integer mediaType; diff --git a/libraries/common/src/main/java/androidx/media3/common/Metadata.java b/libraries/common/src/main/java/androidx/media3/common/Metadata.java index 201d9b1296..fe98e139b1 100644 --- a/libraries/common/src/main/java/androidx/media3/common/Metadata.java +++ b/libraries/common/src/main/java/androidx/media3/common/Metadata.java @@ -59,6 +59,7 @@ public final class Metadata implements Parcelable { } private final Entry[] entries; + /** * The presentation time of the metadata, in microseconds. * diff --git a/libraries/common/src/main/java/androidx/media3/common/MimeTypes.java b/libraries/common/src/main/java/androidx/media3/common/MimeTypes.java index 0bc1172c40..ee09e81c05 100644 --- a/libraries/common/src/main/java/androidx/media3/common/MimeTypes.java +++ b/libraries/common/src/main/java/androidx/media3/common/MimeTypes.java @@ -131,6 +131,7 @@ public final class MimeTypes { public static final String APPLICATION_TX3G = BASE_TYPE_APPLICATION + "/x-quicktime-tx3g"; public static final String APPLICATION_MP4VTT = BASE_TYPE_APPLICATION + "/x-mp4-vtt"; public static final String APPLICATION_MP4CEA608 = BASE_TYPE_APPLICATION + "/x-mp4-cea-608"; + /** * @deprecated RawCC is a Google-internal subtitle format that isn't supported by this version of * Media3. There is no replacement for this value. @@ -738,6 +739,7 @@ public final class MimeTypes { /* package */ static final class Mp4aObjectType { /** The Object Type Indication of the MP4A codec. */ public final int objectTypeIndication; + /** The Audio Object Type Indication of the MP4A codec, or 0 if it is absent. */ public final int audioObjectTypeIndication; diff --git a/libraries/common/src/main/java/androidx/media3/common/ParserException.java b/libraries/common/src/main/java/androidx/media3/common/ParserException.java index 0d623a20e6..5ae5e46900 100644 --- a/libraries/common/src/main/java/androidx/media3/common/ParserException.java +++ b/libraries/common/src/main/java/androidx/media3/common/ParserException.java @@ -95,6 +95,7 @@ public class ParserException extends IOException { * false when a parser encounters a legal condition which it does not support. */ public final boolean contentIsMalformed; + /** The {@link DataType data type} of the parsed bitstream. */ public final int dataType; diff --git a/libraries/common/src/main/java/androidx/media3/common/PlaybackException.java b/libraries/common/src/main/java/androidx/media3/common/PlaybackException.java index 57e4b5dc1c..26dba9755c 100644 --- a/libraries/common/src/main/java/androidx/media3/common/PlaybackException.java +++ b/libraries/common/src/main/java/androidx/media3/common/PlaybackException.java @@ -95,15 +95,19 @@ public class PlaybackException extends Exception implements Bundleable { /** Caused by an error whose cause could not be identified. */ public static final int ERROR_CODE_UNSPECIFIED = 1000; + /** * Caused by an unidentified error in a remote Player, which is a Player that runs on a different * host or process. */ public static final int ERROR_CODE_REMOTE_ERROR = 1001; + /** Caused by the loading position falling behind the sliding window of available live content. */ public static final int ERROR_CODE_BEHIND_LIVE_WINDOW = 1002; + /** Caused by a generic timeout. */ public static final int ERROR_CODE_TIMEOUT = 1003; + /** * Caused by a failed runtime check. * @@ -116,6 +120,7 @@ public class PlaybackException extends Exception implements Bundleable { /** Caused by an Input/Output error which could not be identified. */ public static final int ERROR_CODE_IO_UNSPECIFIED = 2000; + /** * Caused by a network connection failure. * @@ -130,8 +135,10 @@ public class PlaybackException extends Exception implements Bundleable { * */ public static final int ERROR_CODE_IO_NETWORK_CONNECTION_FAILED = 2001; + /** Caused by a network timeout, meaning the server is taking too long to fulfill a request. */ public static final int ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT = 2002; + /** * Caused by a server returning a resource with an invalid "Content-Type" HTTP header value. * @@ -139,15 +146,19 @@ public class PlaybackException extends Exception implements Bundleable { * returns a paywall HTML page, with content type "text/html". */ public static final int ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE = 2003; + /** Caused by an HTTP server returning an unexpected HTTP response status code. */ public static final int ERROR_CODE_IO_BAD_HTTP_STATUS = 2004; + /** Caused by a non-existent file. */ public static final int ERROR_CODE_IO_FILE_NOT_FOUND = 2005; + /** * Caused by lack of permission to perform an IO operation. For example, lack of permission to * access internet or external storage. */ public static final int ERROR_CODE_IO_NO_PERMISSION = 2006; + /** * Caused by the player trying to access cleartext HTTP traffic (meaning http:// rather than * https://) when the app's Network Security Configuration does not permit it. @@ -157,6 +168,7 @@ public class PlaybackException extends Exception implements Bundleable { * corresponding troubleshooting topic. */ public static final int ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED = 2007; + /** Caused by reading data out of the data bound. */ public static final int ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE = 2008; @@ -164,16 +176,19 @@ public class PlaybackException extends Exception implements Bundleable { /** Caused by a parsing error associated with a media container format bitstream. */ public static final int ERROR_CODE_PARSING_CONTAINER_MALFORMED = 3001; + /** * Caused by a parsing error associated with a media manifest. Examples of a media manifest are a * DASH or a SmoothStreaming manifest, or an HLS playlist. */ public static final int ERROR_CODE_PARSING_MANIFEST_MALFORMED = 3002; + /** * Caused by attempting to extract a file with an unsupported media container format, or an * unsupported media container feature. */ public static final int ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED = 3003; + /** * Caused by an unsupported feature in a media manifest. Examples of a media manifest are a DASH * or a SmoothStreaming manifest, or an HLS playlist. @@ -184,12 +199,16 @@ public class PlaybackException extends Exception implements Bundleable { /** Caused by a decoder initialization failure. */ public static final int ERROR_CODE_DECODER_INIT_FAILED = 4001; + /** Caused by a decoder query failure. */ public static final int ERROR_CODE_DECODER_QUERY_FAILED = 4002; + /** Caused by a failure while trying to decode media samples. */ public static final int ERROR_CODE_DECODING_FAILED = 4003; + /** Caused by trying to decode content whose format exceeds the capabilities of the device. */ public static final int ERROR_CODE_DECODING_FORMAT_EXCEEDS_CAPABILITIES = 4004; + /** Caused by trying to decode content whose format is not supported. */ public static final int ERROR_CODE_DECODING_FORMAT_UNSUPPORTED = 4005; @@ -197,6 +216,7 @@ public class PlaybackException extends Exception implements Bundleable { /** Caused by an AudioTrack initialization failure. */ public static final int ERROR_CODE_AUDIO_TRACK_INIT_FAILED = 5001; + /** Caused by an AudioTrack write operation failure. */ public static final int ERROR_CODE_AUDIO_TRACK_WRITE_FAILED = 5002; @@ -204,13 +224,16 @@ public class PlaybackException extends Exception implements Bundleable { /** Caused by an unspecified error related to DRM protection. */ public static final int ERROR_CODE_DRM_UNSPECIFIED = 6000; + /** * Caused by a chosen DRM protection scheme not being supported by the device. Examples of DRM * protection schemes are ClearKey and Widevine. */ public static final int ERROR_CODE_DRM_SCHEME_UNSUPPORTED = 6001; + /** Caused by a failure while provisioning the device. */ public static final int ERROR_CODE_DRM_PROVISIONING_FAILED = 6002; + /** * Caused by attempting to play incompatible DRM-protected content. * @@ -218,14 +241,19 @@ public class PlaybackException extends Exception implements Bundleable { * (like Widevine) for which there is no corresponding license acquisition data (like a pssh box). */ public static final int ERROR_CODE_DRM_CONTENT_ERROR = 6003; + /** Caused by a failure while trying to obtain a license. */ public static final int ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED = 6004; + /** Caused by an operation being disallowed by a license policy. */ public static final int ERROR_CODE_DRM_DISALLOWED_OPERATION = 6005; + /** Caused by an error in the DRM system. */ public static final int ERROR_CODE_DRM_SYSTEM_ERROR = 6006; + /** Caused by the device having revoked DRM privileges. */ public static final int ERROR_CODE_DRM_DEVICE_REVOKED = 6007; + /** Caused by an expired DRM license being loaded into an open DRM session. */ public static final int ERROR_CODE_DRM_LICENSE_EXPIRED = 6008; @@ -233,6 +261,7 @@ public class PlaybackException extends Exception implements Bundleable { /** Caused by a failure when initializing a {@link VideoFrameProcessor}. */ @UnstableApi public static final int ERROR_CODE_VIDEO_FRAME_PROCESSOR_INIT_FAILED = 7000; + /** Caused by a failure when processing a video frame. */ @UnstableApi public static final int ERROR_CODE_VIDEO_FRAME_PROCESSING_FAILED = 7001; diff --git a/libraries/common/src/main/java/androidx/media3/common/Player.java b/libraries/common/src/main/java/androidx/media3/common/Player.java index 71cfae550d..b4b7d5604e 100644 --- a/libraries/common/src/main/java/androidx/media3/common/Player.java +++ b/libraries/common/src/main/java/androidx/media3/common/Player.java @@ -247,22 +247,29 @@ public interface Player { * The UID of the window, or {@code null} if the timeline is {@link Timeline#isEmpty() empty}. */ @Nullable public final Object windowUid; + /** * @deprecated Use {@link #mediaItemIndex} instead. */ @UnstableApi @Deprecated public final int windowIndex; + /** The media item index. */ public final int mediaItemIndex; + /** The media item, or {@code null} if the timeline is {@link Timeline#isEmpty() empty}. */ @UnstableApi @Nullable public final MediaItem mediaItem; + /** * The UID of the period, or {@code null} if the timeline is {@link Timeline#isEmpty() empty}. */ @Nullable public final Object periodUid; + /** The period index. */ public final int periodIndex; + /** The playback position, in milliseconds. */ public final long positionMs; + /** * The content position, in milliseconds. * @@ -270,10 +277,12 @@ public interface Player { * #positionMs}. */ public final long contentPositionMs; + /** * The ad group index if the playback position is within an ad, {@link C#INDEX_UNSET} otherwise. */ public final int adGroupIndex; + /** * The index of the ad within the ad group if the playback position is within an ad, {@link * C#INDEX_UNSET} otherwise. @@ -1160,22 +1169,26 @@ public interface Player { @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({STATE_IDLE, STATE_BUFFERING, STATE_READY, STATE_ENDED}) @interface State {} + /** * The player is idle, meaning it holds only limited resources. The player must be {@link * #prepare() prepared} before it will play the media. */ int STATE_IDLE = 1; + /** * The player is not able to immediately play the media, but is doing work toward being able to do * so. This state typically occurs when the player needs to buffer more data before playback can * start. */ int STATE_BUFFERING = 2; + /** * The player is able to immediately play from its current position. The player will be playing if * {@link #getPlayWhenReady()} is true, and paused otherwise. */ int STATE_READY = 3; + /** The player has finished playing the media. */ int STATE_ENDED = 4; @@ -1202,16 +1215,22 @@ public interface Player { PLAY_WHEN_READY_CHANGE_REASON_SUPPRESSED_TOO_LONG }) @interface PlayWhenReadyChangeReason {} + /** Playback has been started or paused by a call to {@link #setPlayWhenReady(boolean)}. */ int PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST = 1; + /** Playback has been paused because of a loss of audio focus. */ int PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS = 2; + /** Playback has been paused to avoid becoming noisy. */ int PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY = 3; + /** Playback has been started or paused because of a remote change. */ int PLAY_WHEN_READY_CHANGE_REASON_REMOTE = 4; + /** Playback has been paused at the end of a media item. */ int PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM = 5; + /** * Playback has been paused because playback has been {@linkplain #getPlaybackSuppressionReason() * suppressed} too long. @@ -1237,14 +1256,18 @@ public interface Player { PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT }) @interface PlaybackSuppressionReason {} + /** Playback is not suppressed. */ int PLAYBACK_SUPPRESSION_REASON_NONE = 0; + /** Playback is suppressed due to transient audio focus loss. */ int PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS = 1; + /** * @deprecated Use {@link #PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT} instead. */ @Deprecated int PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_ROUTE = 2; + /** * Playback is suppressed due to attempt to play on an unsuitable audio output (e.g. attempt to * play on built-in speaker on a Wear OS device). @@ -1262,12 +1285,14 @@ public interface Player { @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({REPEAT_MODE_OFF, REPEAT_MODE_ONE, REPEAT_MODE_ALL}) @interface RepeatMode {} + /** * Normal playback without repetition. "Previous" and "Next" actions move to the previous and next * {@link MediaItem} respectively, and do nothing when there is no previous or next {@link * MediaItem} to move to. */ int REPEAT_MODE_OFF = 0; + /** * Repeats the currently playing {@link MediaItem} infinitely during ongoing playback. "Previous" * and "Next" actions behave as they do in {@link #REPEAT_MODE_OFF}, moving to the previous and @@ -1275,6 +1300,7 @@ public interface Player { * MediaItem} to move to. */ int REPEAT_MODE_ONE = 1; + /** * Repeats the entire timeline infinitely. "Previous" and "Next" actions behave as they do in * {@link #REPEAT_MODE_OFF}, but with looping at the ends so that "Previous" when playing the @@ -1303,6 +1329,7 @@ public interface Player { DISCONTINUITY_REASON_INTERNAL }) @interface DiscontinuityReason {} + /** * Automatic playback transition from one period in the timeline to the next. The period index may * be the same as it was before the discontinuity in case the current period is repeated. @@ -1312,17 +1339,22 @@ public interface Player { * control the same playback on a remote device). */ int DISCONTINUITY_REASON_AUTO_TRANSITION = 0; + /** Seek within the current period or to another period. */ int DISCONTINUITY_REASON_SEEK = 1; + /** * Seek adjustment due to being unable to seek to the requested position or because the seek was * permitted to be inexact. */ int DISCONTINUITY_REASON_SEEK_ADJUSTMENT = 2; + /** Discontinuity introduced by a skipped period (for instance a skipped ad). */ int DISCONTINUITY_REASON_SKIP = 3; + /** Discontinuity caused by the removal of the current period from the {@link Timeline}. */ int DISCONTINUITY_REASON_REMOVE = 4; + /** Discontinuity introduced internally (e.g. by the source). */ int DISCONTINUITY_REASON_INTERNAL = 5; @@ -1337,8 +1369,10 @@ public interface Player { @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, TIMELINE_CHANGE_REASON_SOURCE_UPDATE}) @interface TimelineChangeReason {} + /** Timeline changed as a result of a change of the playlist items or the order of the items. */ int TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED = 0; + /** * Timeline changed as a result of a source update (e.g. result of a dynamic update by the played * media). @@ -1365,8 +1399,10 @@ public interface Player { MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED }) @interface MediaItemTransitionReason {} + /** The media item has been repeated. */ int MEDIA_ITEM_TRANSITION_REASON_REPEAT = 0; + /** * Playback has automatically transitioned to the next media item. * @@ -1374,8 +1410,10 @@ public interface Player { * can control the same playback on a remote device). */ int MEDIA_ITEM_TRANSITION_REASON_AUTO = 1; + /** A seek to another media item has occurred. */ int MEDIA_ITEM_TRANSITION_REASON_SEEK = 2; + /** * The current media item has changed because of a change in the playlist. This can either be if * the media item previously being played has been removed, or when the playlist becomes non-empty @@ -1427,72 +1465,103 @@ public interface Player { EVENT_DEVICE_VOLUME_CHANGED }) @interface Event {} + /** {@link #getCurrentTimeline()} changed. */ int EVENT_TIMELINE_CHANGED = 0; + /** {@link #getCurrentMediaItem()} changed or the player started repeating the current item. */ int EVENT_MEDIA_ITEM_TRANSITION = 1; + /** {@link #getCurrentTracks()} changed. */ int EVENT_TRACKS_CHANGED = 2; + /** {@link #isLoading()} ()} changed. */ int EVENT_IS_LOADING_CHANGED = 3; + /** {@link #getPlaybackState()} changed. */ int EVENT_PLAYBACK_STATE_CHANGED = 4; + /** {@link #getPlayWhenReady()} changed. */ int EVENT_PLAY_WHEN_READY_CHANGED = 5; + /** {@link #getPlaybackSuppressionReason()} changed. */ int EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED = 6; + /** {@link #isPlaying()} changed. */ int EVENT_IS_PLAYING_CHANGED = 7; + /** {@link #getRepeatMode()} changed. */ int EVENT_REPEAT_MODE_CHANGED = 8; + /** {@link #getShuffleModeEnabled()} changed. */ int EVENT_SHUFFLE_MODE_ENABLED_CHANGED = 9; + /** {@link #getPlayerError()} changed. */ int EVENT_PLAYER_ERROR = 10; + /** * A position discontinuity occurred. See {@link Listener#onPositionDiscontinuity(PositionInfo, * PositionInfo, int)}. */ int EVENT_POSITION_DISCONTINUITY = 11; + /** {@link #getPlaybackParameters()} changed. */ int EVENT_PLAYBACK_PARAMETERS_CHANGED = 12; + /** {@link #isCommandAvailable(int)} changed for at least one {@link Command}. */ int EVENT_AVAILABLE_COMMANDS_CHANGED = 13; + /** {@link #getMediaMetadata()} changed. */ int EVENT_MEDIA_METADATA_CHANGED = 14; + /** {@link #getPlaylistMetadata()} changed. */ int EVENT_PLAYLIST_METADATA_CHANGED = 15; + /** {@link #getSeekBackIncrement()} changed. */ int EVENT_SEEK_BACK_INCREMENT_CHANGED = 16; + /** {@link #getSeekForwardIncrement()} changed. */ int EVENT_SEEK_FORWARD_INCREMENT_CHANGED = 17; + /** {@link #getMaxSeekToPreviousPosition()} changed. */ int EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED = 18; + /** {@link #getTrackSelectionParameters()} changed. */ int EVENT_TRACK_SELECTION_PARAMETERS_CHANGED = 19; + /** {@link #getAudioAttributes()} changed. */ int EVENT_AUDIO_ATTRIBUTES_CHANGED = 20; + /** The audio session id was set. */ int EVENT_AUDIO_SESSION_ID = 21; + /** {@link #getVolume()} changed. */ int EVENT_VOLUME_CHANGED = 22; + /** Skipping silences in the audio stream is enabled or disabled. */ int EVENT_SKIP_SILENCE_ENABLED_CHANGED = 23; + /** The size of the surface onto which the video is being rendered changed. */ int EVENT_SURFACE_SIZE_CHANGED = 24; + /** {@link #getVideoSize()} changed. */ int EVENT_VIDEO_SIZE_CHANGED = 25; + /** * A frame is rendered for the first time since setting the surface, or since the renderer was * reset, or since the stream being rendered was changed. */ int EVENT_RENDERED_FIRST_FRAME = 26; + /** {@link #getCurrentCues()} changed. */ int EVENT_CUES = 27; + /** Metadata associated with the current playback time changed. */ int EVENT_METADATA = 28; + /** {@link #getDeviceInfo()} changed. */ int EVENT_DEVICE_INFO_CHANGED = 29; + /** {@link #getDeviceVolume()} changed. */ int EVENT_DEVICE_VOLUME_CHANGED = 30; @@ -1591,6 +1660,7 @@ public interface Player { COMMAND_RELEASE, }) @interface Command {} + /** * Command to start, pause or resume playback. * @@ -1636,6 +1706,7 @@ public interface Player { * #isCommandAvailable(int) available}. */ int COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM = 5; + /** * @deprecated Use {@link #COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM} instead. */ @@ -1648,11 +1719,13 @@ public interface Player { * {@linkplain #isCommandAvailable(int) available}. */ int COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM = 6; + /** * @deprecated Use {@link #COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM} instead. */ @UnstableApi @Deprecated int COMMAND_SEEK_TO_PREVIOUS_WINDOW = COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM; + /** * Command to seek to an earlier position in the current {@link MediaItem} or the default position * of the previous {@link MediaItem}. @@ -1661,6 +1734,7 @@ public interface Player { * #isCommandAvailable(int) available}. */ int COMMAND_SEEK_TO_PREVIOUS = 7; + /** * Command to seek to the default position of the next {@link MediaItem}. * @@ -1668,10 +1742,12 @@ public interface Player { * #isCommandAvailable(int) available}. */ int COMMAND_SEEK_TO_NEXT_MEDIA_ITEM = 8; + /** * @deprecated Use {@link #COMMAND_SEEK_TO_NEXT_MEDIA_ITEM} instead. */ @UnstableApi @Deprecated int COMMAND_SEEK_TO_NEXT_WINDOW = COMMAND_SEEK_TO_NEXT_MEDIA_ITEM; + /** * Command to seek to a later position in the current {@link MediaItem} or the default position of * the next {@link MediaItem}. @@ -1693,10 +1769,12 @@ public interface Player { * */ int COMMAND_SEEK_TO_MEDIA_ITEM = 10; + /** * @deprecated Use {@link #COMMAND_SEEK_TO_MEDIA_ITEM} instead. */ @UnstableApi @Deprecated int COMMAND_SEEK_TO_WINDOW = COMMAND_SEEK_TO_MEDIA_ITEM; + /** * Command to seek back by a fixed increment inside the current {@link MediaItem}. * @@ -1704,6 +1782,7 @@ public interface Player { * #isCommandAvailable(int) available}. */ int COMMAND_SEEK_BACK = 11; + /** * Command to seek forward by a fixed increment inside the current {@link MediaItem}. * @@ -1831,6 +1910,7 @@ public interface Player { * */ int COMMAND_SET_MEDIA_ITEM = 31; + /** * Command to change the {@linkplain MediaItem media items} in the playlist. * @@ -1897,6 +1977,7 @@ public interface Player { * @deprecated Use {@link #COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS} instead. */ @Deprecated int COMMAND_SET_DEVICE_VOLUME = 25; + /** * Command to set the device volume with volume flags. * @@ -1909,6 +1990,7 @@ public interface Player { * @deprecated Use {@link #COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS} instead. */ @Deprecated int COMMAND_ADJUST_DEVICE_VOLUME = 26; + /** * Command to increase and decrease the device volume and mute it with volume flags. * @@ -1964,6 +2046,7 @@ public interface Player { * #isCommandAvailable(int) available}. */ int COMMAND_GET_TRACKS = 30; + /** * Command to release the player. * diff --git a/libraries/common/src/main/java/androidx/media3/common/SimpleBasePlayer.java b/libraries/common/src/main/java/androidx/media3/common/SimpleBasePlayer.java index 92c79c68a8..52198d5829 100644 --- a/libraries/common/src/main/java/androidx/media3/common/SimpleBasePlayer.java +++ b/libraries/common/src/main/java/androidx/media3/common/SimpleBasePlayer.java @@ -772,105 +772,142 @@ public abstract class SimpleBasePlayer extends BasePlayer { /** The available {@link Commands}. */ public final Commands availableCommands; + /** Whether playback should proceed when ready and not suppressed. */ public final boolean playWhenReady; + /** The last reason for changing {@link #playWhenReady}. */ public final @PlayWhenReadyChangeReason int playWhenReadyChangeReason; + /** The {@linkplain Player.State state} of the player. */ public final @Player.State int playbackState; + /** The reason why playback is suppressed even if {@link #getPlayWhenReady()} is true. */ public final @PlaybackSuppressionReason int playbackSuppressionReason; + /** The last error that caused playback to fail, or null if there was no error. */ @Nullable public final PlaybackException playerError; + /** The {@link RepeatMode} used for playback. */ public final @RepeatMode int repeatMode; + /** Whether shuffling of media items is enabled. */ public final boolean shuffleModeEnabled; + /** Whether the player is currently loading its source. */ public final boolean isLoading; + /** The {@link Player#seekBack()} increment in milliseconds. */ public final long seekBackIncrementMs; + /** The {@link Player#seekForward()} increment in milliseconds. */ public final long seekForwardIncrementMs; + /** * The maximum position for which {@link #seekToPrevious()} seeks to the previous item, in * milliseconds. */ public final long maxSeekToPreviousPositionMs; + /** The currently active {@link PlaybackParameters}. */ public final PlaybackParameters playbackParameters; + /** The currently active {@link TrackSelectionParameters}. */ public final TrackSelectionParameters trackSelectionParameters; + /** The current {@link AudioAttributes}. */ public final AudioAttributes audioAttributes; + /** The current audio volume, with 0 being silence and 1 being unity gain (signal unchanged). */ @FloatRange(from = 0, to = 1.0) public final float volume; + /** The current video size. */ public final VideoSize videoSize; + /** The current {@linkplain CueGroup cues}. */ public final CueGroup currentCues; + /** The {@link DeviceInfo}. */ public final DeviceInfo deviceInfo; + /** The current device volume. */ @IntRange(from = 0) public final int deviceVolume; + /** Whether the device is muted. */ public final boolean isDeviceMuted; + /** The size of the surface onto which the video is being rendered. */ public final Size surfaceSize; + /** * Whether a frame has been rendered for the first time since setting the surface, a rendering * reset, or since the stream being rendered was changed. */ public final boolean newlyRenderedFirstFrame; + /** The most recent timed metadata. */ public final Metadata timedMetadata; + /** The media items in the playlist. */ public final ImmutableList playlist; + /** The {@link Timeline} derived from the {@link #playlist}. */ public final Timeline timeline; + /** The playlist {@link MediaMetadata}. */ public final MediaMetadata playlistMetadata; + /** * The current media item index, or {@link C#INDEX_UNSET} to assume the default first item of * the playlist is played. */ public final int currentMediaItemIndex; + /** The current ad group index, or {@link C#INDEX_UNSET} if no ad is playing. */ public final int currentAdGroupIndex; + /** The current ad index in the ad group, or {@link C#INDEX_UNSET} if no ad is playing. */ public final int currentAdIndexInAdGroup; + /** * The {@link PositionSupplier} for the current content playback position in milliseconds, or * {@link C#TIME_UNSET} to indicate the default start position. */ public final PositionSupplier contentPositionMsSupplier; + /** * The {@link PositionSupplier} for the current ad playback position in milliseconds. The value * is unused if no ad is playing. */ public final PositionSupplier adPositionMsSupplier; + /** * The {@link PositionSupplier} for the estimated position up to which the currently playing * content is buffered, in milliseconds, or {@link C#TIME_UNSET} to indicate the default start * position. */ public final PositionSupplier contentBufferedPositionMsSupplier; + /** * The {@link PositionSupplier} for the estimated position up to which the currently playing ad * is buffered, in milliseconds. The value is unused if no ad is playing. */ public final PositionSupplier adBufferedPositionMsSupplier; + /** The {@link PositionSupplier} for the estimated total buffered duration in milliseconds. */ public final PositionSupplier totalBufferedDurationMsSupplier; + /** Signals that a position discontinuity happened since the last update to the player. */ public final boolean hasPositionDiscontinuity; + /** * The {@linkplain Player.DiscontinuityReason reason} for the last position discontinuity. The * value is unused if {@link #hasPositionDiscontinuity} is {@code false}. */ public final @Player.DiscontinuityReason int positionDiscontinuityReason; + /** * The position, in milliseconds, in the current content or ad from which playback continued * after the discontinuity. The value is unused if {@link #hasPositionDiscontinuity} is {@code @@ -1524,10 +1561,13 @@ public abstract class SimpleBasePlayer extends BasePlayer { /** The unique identifier of this media item. */ public final Object uid; + /** The {@link Tracks} of this media item. */ public final Tracks tracks; + /** The {@link MediaItem}. */ public final MediaItem mediaItem; + /** * The {@link MediaMetadata}, including static data from the {@link MediaItem#mediaMetadata * MediaItem} and the media's {@link Format#metadata Format}, as well any dynamic metadata that @@ -1536,47 +1576,59 @@ public abstract class SimpleBasePlayer extends BasePlayer { * {@link Format#metadata Formats}. */ @Nullable public final MediaMetadata mediaMetadata; + /** The manifest of the media item, or null if not applicable. */ @Nullable public final Object manifest; + /** The active {@link MediaItem.LiveConfiguration}, or null if the media item is not live. */ @Nullable public final MediaItem.LiveConfiguration liveConfiguration; + /** * The start time of the live presentation, in milliseconds since the Unix epoch, or {@link * C#TIME_UNSET} if unknown or not applicable. */ public final long presentationStartTimeMs; + /** * The start time of the live window, in milliseconds since the Unix epoch, or {@link * C#TIME_UNSET} if unknown or not applicable. */ public final long windowStartTimeMs; + /** * The offset between {@link SystemClock#elapsedRealtime()} and the time since the Unix epoch * according to the clock of the media origin server, or {@link C#TIME_UNSET} if unknown or not * applicable. */ public final long elapsedRealtimeEpochOffsetMs; + /** Whether it's possible to seek within this media item. */ public final boolean isSeekable; + /** Whether this media item may change over time, for example a moving live window. */ public final boolean isDynamic; + /** * The default position relative to the start of the media item at which to begin playback, in * microseconds. */ public final long defaultPositionUs; + /** The duration of the media item, in microseconds, or {@link C#TIME_UNSET} if unknown. */ public final long durationUs; + /** * The position of the start of this media item relative to the start of the first period * belonging to it, in microseconds. */ public final long positionInFirstPeriodUs; + /** * Whether this media item contains placeholder information because the real information has yet * to be loaded. */ public final boolean isPlaceholder; + /** * The list of {@linkplain PeriodData periods} in this media item, or an empty list to assume a * single period without ads and the same duration as the media item. @@ -1861,16 +1913,19 @@ public abstract class SimpleBasePlayer extends BasePlayer { /** The unique identifier of the period within its media item. */ public final Object uid; + /** * The total duration of the period, in microseconds, or {@link C#TIME_UNSET} if unknown. Only * the last period in a media item can have an unknown duration. */ public final long durationUs; + /** * The {@link AdPlaybackState} of the period, or {@link AdPlaybackState#NONE} if there are no * ads. */ public final AdPlaybackState adPlaybackState; + /** * Whether this period contains placeholder information because the real information has yet to * be loaded. diff --git a/libraries/common/src/main/java/androidx/media3/common/StreamKey.java b/libraries/common/src/main/java/androidx/media3/common/StreamKey.java index 263909c9d7..599837ea57 100644 --- a/libraries/common/src/main/java/androidx/media3/common/StreamKey.java +++ b/libraries/common/src/main/java/androidx/media3/common/StreamKey.java @@ -41,8 +41,10 @@ public final class StreamKey implements Comparable, Parcelable, Bundl /** The period index. */ public final int periodIndex; + /** The group index. */ public final int groupIndex; + /** The stream index. */ public final int streamIndex; diff --git a/libraries/common/src/main/java/androidx/media3/common/SurfaceInfo.java b/libraries/common/src/main/java/androidx/media3/common/SurfaceInfo.java index 42477cc132..02d6462c5b 100644 --- a/libraries/common/src/main/java/androidx/media3/common/SurfaceInfo.java +++ b/libraries/common/src/main/java/androidx/media3/common/SurfaceInfo.java @@ -27,10 +27,13 @@ public final class SurfaceInfo { /** The {@link Surface}. */ public final Surface surface; + /** The width of frames rendered to the {@link #surface}, in pixels. */ public final int width; + /** The height of frames rendered to the {@link #surface}, in pixels. */ public final int height; + /** * A counter-clockwise rotation to apply to frames before rendering them to the {@link #surface}. * diff --git a/libraries/common/src/main/java/androidx/media3/common/Timeline.java b/libraries/common/src/main/java/androidx/media3/common/Timeline.java index 42844973cd..d92f586ccc 100644 --- a/libraries/common/src/main/java/androidx/media3/common/Timeline.java +++ b/libraries/common/src/main/java/androidx/media3/common/Timeline.java @@ -1188,6 +1188,7 @@ public abstract class Timeline implements Bundleable { Window window, Period period, int windowIndex, long windowPositionUs) { return getPeriodPositionUs(window, period, windowIndex, windowPositionUs); } + /** * @deprecated Use {@link #getPeriodPositionUs(Window, Period, int, long, long)} instead. */ diff --git a/libraries/common/src/main/java/androidx/media3/common/TrackGroup.java b/libraries/common/src/main/java/androidx/media3/common/TrackGroup.java index f13d3dca4a..6a19c28ea6 100644 --- a/libraries/common/src/main/java/androidx/media3/common/TrackGroup.java +++ b/libraries/common/src/main/java/androidx/media3/common/TrackGroup.java @@ -54,8 +54,10 @@ public final class TrackGroup implements Bundleable { /** The number of tracks in the group. */ @UnstableApi public final int length; + /** An identifier for the track group. */ @UnstableApi public final String id; + /** The type of tracks in the group. */ @UnstableApi public final @C.TrackType int type; diff --git a/libraries/common/src/main/java/androidx/media3/common/TrackSelectionOverride.java b/libraries/common/src/main/java/androidx/media3/common/TrackSelectionOverride.java index c40e88b654..f7b08bacb0 100644 --- a/libraries/common/src/main/java/androidx/media3/common/TrackSelectionOverride.java +++ b/libraries/common/src/main/java/androidx/media3/common/TrackSelectionOverride.java @@ -48,6 +48,7 @@ public final class TrackSelectionOverride implements Bundleable { /** The media {@link TrackGroup} whose {@link #trackIndices} are forced to be selected. */ public final TrackGroup mediaTrackGroup; + /** The indices of tracks in a {@link TrackGroup} to be selected. */ public final ImmutableList trackIndices; diff --git a/libraries/common/src/main/java/androidx/media3/common/TrackSelectionParameters.java b/libraries/common/src/main/java/androidx/media3/common/TrackSelectionParameters.java index 432335d0b6..3004654077 100644 --- a/libraries/common/src/main/java/androidx/media3/common/TrackSelectionParameters.java +++ b/libraries/common/src/main/java/androidx/media3/common/TrackSelectionParameters.java @@ -93,11 +93,13 @@ public class TrackSelectionParameters implements Bundleable { * selection, then no tracks will be selected. */ @UnstableApi public static final int AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED = 2; + /** * The track selector will enable audio offload if the selected tracks and renderer capabilities * are compatible. */ @UnstableApi public static final int AUDIO_OFFLOAD_MODE_PREFERENCE_ENABLED = 1; + /** * The track selector will disable audio offload on the audio sink. Track selection will not take * into consideration whether or not a track is offload compatible. @@ -887,6 +889,7 @@ public class TrackSelectionParameters implements Bundleable { @UnstableApi @SuppressWarnings("deprecation") public static final TrackSelectionParameters DEFAULT_WITHOUT_CONTEXT = new Builder().build(); + /** * @deprecated This instance is not configured using {@link Context} constraints. Use {@link * #getDefaults(Context)} instead. @@ -909,6 +912,7 @@ public class TrackSelectionParameters implements Bundleable { * #viewportHeight} and {@link #viewportOrientationMayChange}) instead. */ public final int maxVideoWidth; + /** * Maximum allowed video height in pixels. The default value is {@link Integer#MAX_VALUE} (i.e. no * constraint). @@ -918,54 +922,66 @@ public class TrackSelectionParameters implements Bundleable { * #viewportHeight} and {@link #viewportOrientationMayChange}) instead. */ public final int maxVideoHeight; + /** * Maximum allowed video frame rate in hertz. The default value is {@link Integer#MAX_VALUE} (i.e. * no constraint). */ public final int maxVideoFrameRate; + /** * Maximum allowed video bitrate in bits per second. The default value is {@link * Integer#MAX_VALUE} (i.e. no constraint). */ public final int maxVideoBitrate; + /** Minimum allowed video width in pixels. The default value is 0 (i.e. no constraint). */ public final int minVideoWidth; + /** Minimum allowed video height in pixels. The default value is 0 (i.e. no constraint). */ public final int minVideoHeight; + /** Minimum allowed video frame rate in hertz. The default value is 0 (i.e. no constraint). */ public final int minVideoFrameRate; + /** * Minimum allowed video bitrate in bits per second. The default value is 0 (i.e. no constraint). */ public final int minVideoBitrate; + /** * Viewport width in pixels. Constrains video track selections for adaptive content so that only * tracks suitable for the viewport are selected. The default value is the physical width of the * primary display, in pixels. */ public final int viewportWidth; + /** * Viewport height in pixels. Constrains video track selections for adaptive content so that only * tracks suitable for the viewport are selected. The default value is the physical height of the * primary display, in pixels. */ public final int viewportHeight; + /** * Whether the viewport orientation may change during playback. Constrains video track selections * for adaptive content so that only tracks suitable for the viewport are selected. The default * value is {@code true}. */ public final boolean viewportOrientationMayChange; + /** * The preferred sample MIME types for video tracks in order of preference, or an empty list for * no preference. The default is an empty list. */ public final ImmutableList preferredVideoMimeTypes; + /** * The preferred {@link C.RoleFlags} for video tracks. {@code 0} selects the default track if * there is one, or the first track if there's no default. The default value is {@code 0}. */ public final @C.RoleFlags int preferredVideoRoleFlags; + // Audio /** * The preferred languages for audio and forced text tracks as IETF BCP 47 conformant tags in @@ -973,21 +989,25 @@ public class TrackSelectionParameters implements Bundleable { * default. The default value is an empty list. */ public final ImmutableList preferredAudioLanguages; + /** * The preferred {@link C.RoleFlags} for audio tracks. {@code 0} selects the default track if * there is one, or the first track if there's no default. The default value is {@code 0}. */ public final @C.RoleFlags int preferredAudioRoleFlags; + /** * Maximum allowed audio channel count. The default value is {@link Integer#MAX_VALUE} (i.e. no * constraint). */ public final int maxAudioChannelCount; + /** * Maximum allowed audio bitrate in bits per second. The default value is {@link * Integer#MAX_VALUE} (i.e. no constraint). */ public final int maxAudioBitrate; + /** * The preferred sample MIME types for audio tracks in order of preference, or an empty list for * no preference. The default is an empty list. @@ -999,12 +1019,14 @@ public class TrackSelectionParameters implements Bundleable { * #AUDIO_OFFLOAD_MODE_PREFERENCE_DISABLED}. */ public final @AudioOffloadModePreference int audioOffloadModePreference; + /** * A constraint on enabling offload. If {@code isGaplessSupportRequired}, then audio offload will * be enabled only if the device supports gapless transitions during offload or the selected audio * is not gapless. */ public final boolean isGaplessSupportRequired; + /** * A constraint on enabling offload. If {@code isSpeedChangeSupportRequired}, then audio offload * will be enabled only if the device supports changing playback speed during offload. @@ -1019,6 +1041,7 @@ public class TrackSelectionParameters implements Bundleable { * enabled. */ public final ImmutableList preferredTextLanguages; + /** * The preferred {@link C.RoleFlags} for text tracks. {@code 0} selects the default track if there * is one, or no track otherwise. The default value is {@code 0}, or {@link C#ROLE_FLAG_SUBTITLE} @@ -1026,23 +1049,27 @@ public class TrackSelectionParameters implements Bundleable { * is enabled. */ public final @C.RoleFlags int preferredTextRoleFlags; + /** * Bitmask of selection flags that are ignored for text track selections. See {@link * C.SelectionFlags}. The default value is {@code 0} (i.e., no flags are ignored). */ public final @C.SelectionFlags int ignoredTextSelectionFlags; + /** * Whether a text track with undetermined language should be selected if no track with {@link * #preferredTextLanguages} is available, or if {@link #preferredTextLanguages} is unset. The * default value is {@code false}. */ public final boolean selectUndeterminedTextLanguage; + // General /** * Whether to force selection of the single lowest bitrate audio and video tracks that comply with * all other constraints. The default value is {@code false}. */ public final boolean forceLowestBitrate; + /** * Whether to force selection of the highest bitrate audio and video tracks that comply with all * other constraints. The default value is {@code false}. diff --git a/libraries/common/src/main/java/androidx/media3/common/Tracks.java b/libraries/common/src/main/java/androidx/media3/common/Tracks.java index a932ac6924..86a73170df 100644 --- a/libraries/common/src/main/java/androidx/media3/common/Tracks.java +++ b/libraries/common/src/main/java/androidx/media3/common/Tracks.java @@ -374,6 +374,7 @@ public final class Tracks implements Bundleable { public int hashCode() { return groups.hashCode(); } + // Bundleable implementation. private static final String FIELD_TRACK_GROUPS = Util.intToStringMaxRadix(0); diff --git a/libraries/common/src/main/java/androidx/media3/common/VideoFrameProcessor.java b/libraries/common/src/main/java/androidx/media3/common/VideoFrameProcessor.java index 97145db344..4735371171 100644 --- a/libraries/common/src/main/java/androidx/media3/common/VideoFrameProcessor.java +++ b/libraries/common/src/main/java/androidx/media3/common/VideoFrameProcessor.java @@ -56,10 +56,13 @@ public interface VideoFrameProcessor { @Target(TYPE_USE) @IntDef({INPUT_TYPE_SURFACE, INPUT_TYPE_BITMAP, INPUT_TYPE_TEXTURE_ID}) @interface InputType {} + /** Input frames come from a {@link #getInputSurface surface}. */ int INPUT_TYPE_SURFACE = 1; + /** Input frames come from a {@link Bitmap}. */ int INPUT_TYPE_BITMAP = 2; + /** * Input frames come from a {@linkplain android.opengl.GLES10#GL_TEXTURE_2D traditional GLES * texture}. diff --git a/libraries/common/src/main/java/androidx/media3/common/audio/AudioProcessingPipeline.java b/libraries/common/src/main/java/androidx/media3/common/audio/AudioProcessingPipeline.java index 735b263dbc..346b21be97 100644 --- a/libraries/common/src/main/java/androidx/media3/common/audio/AudioProcessingPipeline.java +++ b/libraries/common/src/main/java/androidx/media3/common/audio/AudioProcessingPipeline.java @@ -71,6 +71,7 @@ public final class AudioProcessingPipeline { /** The {@link AudioProcessor} instances passed to {@link AudioProcessingPipeline}. */ private final ImmutableList audioProcessors; + /** * The processors that are {@linkplain AudioProcessor#isActive() active} based on the current * configuration. @@ -82,10 +83,13 @@ public final class AudioProcessingPipeline { * as {@link #activeAudioProcessors}. */ private ByteBuffer[] outputBuffers; + /** The {@link AudioFormat} currently being output by the pipeline. */ private AudioFormat outputAudioFormat; + /** The {@link AudioFormat} that will be output following a {@link #flush()}. */ private AudioFormat pendingOutputAudioFormat; + /** Whether input has ended, either due to configuration change or end of stream. */ private boolean inputEnded; diff --git a/libraries/common/src/main/java/androidx/media3/common/audio/AudioProcessor.java b/libraries/common/src/main/java/androidx/media3/common/audio/AudioProcessor.java index 46178edb28..681c6491c5 100644 --- a/libraries/common/src/main/java/androidx/media3/common/audio/AudioProcessor.java +++ b/libraries/common/src/main/java/androidx/media3/common/audio/AudioProcessor.java @@ -52,10 +52,13 @@ public interface AudioProcessor { /** The sample rate in Hertz. */ public final int sampleRate; + /** The number of interleaved channels. */ public final int channelCount; + /** The type of linear PCM encoding. */ public final @C.PcmEncoding int encoding; + /** The number of bytes used to represent one audio frame. */ public final int bytesPerFrame; diff --git a/libraries/common/src/main/java/androidx/media3/common/audio/BaseAudioProcessor.java b/libraries/common/src/main/java/androidx/media3/common/audio/BaseAudioProcessor.java index 0939e6fce2..2251c1e79e 100644 --- a/libraries/common/src/main/java/androidx/media3/common/audio/BaseAudioProcessor.java +++ b/libraries/common/src/main/java/androidx/media3/common/audio/BaseAudioProcessor.java @@ -31,6 +31,7 @@ public abstract class BaseAudioProcessor implements AudioProcessor { /** The current input audio format. */ protected AudioFormat inputAudioFormat; + /** The current output audio format. */ protected AudioFormat outputAudioFormat; diff --git a/libraries/common/src/main/java/androidx/media3/common/audio/SpeedChangingAudioProcessor.java b/libraries/common/src/main/java/androidx/media3/common/audio/SpeedChangingAudioProcessor.java index 13e8d1011a..ae418e294d 100644 --- a/libraries/common/src/main/java/androidx/media3/common/audio/SpeedChangingAudioProcessor.java +++ b/libraries/common/src/main/java/androidx/media3/common/audio/SpeedChangingAudioProcessor.java @@ -34,6 +34,7 @@ public final class SpeedChangingAudioProcessor extends BaseAudioProcessor { /** The speed provider that provides the speed for each timestamp. */ private final SpeedProvider speedProvider; + /** * The {@link SonicAudioProcessor} used to change the speed, when needed. If there is no speed * change required, the input buffer is copied to the output buffer and this processor is not diff --git a/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java b/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java index a77a75c66c..c8aa409d73 100644 --- a/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java +++ b/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java @@ -44,6 +44,7 @@ public final class CueGroup implements Bundleable { *

This list may be empty if the group represents a state with no cues. */ public final ImmutableList cues; + /** * The presentation time of the {@link #cues}, in microseconds. * diff --git a/libraries/common/src/main/java/androidx/media3/common/util/EGLSurfaceTexture.java b/libraries/common/src/main/java/androidx/media3/common/util/EGLSurfaceTexture.java index d764882e2e..9a885b2af2 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/EGLSurfaceTexture.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/EGLSurfaceTexture.java @@ -56,8 +56,10 @@ public final class EGLSurfaceTexture implements SurfaceTexture.OnFrameAvailableL /** No secure EGL surface and context required. */ public static final int SECURE_MODE_NONE = 0; + /** Creating a surfaceless, secured EGL context. */ public static final int SECURE_MODE_SURFACELESS_CONTEXT = 1; + /** Creating a secure surface backed by a pixel buffer. */ public static final int SECURE_MODE_PROTECTED_PBUFFER = 2; diff --git a/libraries/common/src/main/java/androidx/media3/common/util/GlProgram.java b/libraries/common/src/main/java/androidx/media3/common/util/GlProgram.java index c2f8a6d798..e343a07e20 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/GlProgram.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/GlProgram.java @@ -38,6 +38,7 @@ public final class GlProgram { // https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_YUV_target.txt private static final int GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT = 0x8BE7; + /** The identifier of a compiled and linked GLSL shader program. */ private final int programId; @@ -367,6 +368,7 @@ public final class GlProgram { this.texIdValue = texId; this.texUnitIndex = texUnitIndex; } + /** Configures {@link #bind()} to use the specified {@code int} {@code value}. */ public void setInt(int value) { this.intValue = value; diff --git a/libraries/common/src/main/java/androidx/media3/common/util/Log.java b/libraries/common/src/main/java/androidx/media3/common/util/Log.java index 313ce33874..cead0186d8 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/Log.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/Log.java @@ -45,14 +45,19 @@ public final class Log { @Target(TYPE_USE) @IntDef({LOG_LEVEL_ALL, LOG_LEVEL_INFO, LOG_LEVEL_WARNING, LOG_LEVEL_ERROR, LOG_LEVEL_OFF}) public @interface LogLevel {} + /** Log level to log all messages. */ public static final int LOG_LEVEL_ALL = 0; + /** Log level to only log informative, warning and error messages. */ public static final int LOG_LEVEL_INFO = 1; + /** Log level to only log warning and error messages. */ public static final int LOG_LEVEL_WARNING = 2; + /** Log level to only log error messages. */ public static final int LOG_LEVEL_ERROR = 3; + /** Log level to disable all logging. */ public static final int LOG_LEVEL_OFF = Integer.MAX_VALUE; diff --git a/libraries/common/src/main/java/androidx/media3/common/util/NotificationUtil.java b/libraries/common/src/main/java/androidx/media3/common/util/NotificationUtil.java index bfec3b4548..ea8a7f6f7d 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/NotificationUtil.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/NotificationUtil.java @@ -54,26 +54,32 @@ public final class NotificationUtil { IMPORTANCE_HIGH }) public @interface Importance {} + /** * @see NotificationManager#IMPORTANCE_UNSPECIFIED */ public static final int IMPORTANCE_UNSPECIFIED = NotificationManager.IMPORTANCE_UNSPECIFIED; + /** * @see NotificationManager#IMPORTANCE_NONE */ public static final int IMPORTANCE_NONE = NotificationManager.IMPORTANCE_NONE; + /** * @see NotificationManager#IMPORTANCE_MIN */ public static final int IMPORTANCE_MIN = NotificationManager.IMPORTANCE_MIN; + /** * @see NotificationManager#IMPORTANCE_LOW */ public static final int IMPORTANCE_LOW = NotificationManager.IMPORTANCE_LOW; + /** * @see NotificationManager#IMPORTANCE_DEFAULT */ public static final int IMPORTANCE_DEFAULT = NotificationManager.IMPORTANCE_DEFAULT; + /** * @see NotificationManager#IMPORTANCE_HIGH */ diff --git a/libraries/common/src/main/java/androidx/media3/common/util/RepeatModeUtil.java b/libraries/common/src/main/java/androidx/media3/common/util/RepeatModeUtil.java index 4214e92dd9..2d03185988 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/RepeatModeUtil.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/RepeatModeUtil.java @@ -46,10 +46,13 @@ public final class RepeatModeUtil { flag = true, value = {REPEAT_TOGGLE_MODE_NONE, REPEAT_TOGGLE_MODE_ONE, REPEAT_TOGGLE_MODE_ALL}) public @interface RepeatToggleModes {} + /** All repeat mode buttons disabled. */ public static final int REPEAT_TOGGLE_MODE_NONE = 0; + /** "Repeat One" button enabled. */ public static final int REPEAT_TOGGLE_MODE_ONE = 1; + /** "Repeat All" button enabled. */ public static final int REPEAT_TOGGLE_MODE_ALL = 1 << 1; // 2 diff --git a/libraries/common/src/main/java/androidx/media3/common/util/UriUtil.java b/libraries/common/src/main/java/androidx/media3/common/util/UriUtil.java index 82d4047baf..cbe64a9a54 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/UriUtil.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/UriUtil.java @@ -25,6 +25,7 @@ public final class UriUtil { /** The length of arrays returned by {@link #getUriIndices(String)}. */ private static final int INDEX_COUNT = 4; + /** * An index into an array returned by {@link #getUriIndices(String)}. * @@ -33,6 +34,7 @@ public final class UriUtil { * including when the URI has no scheme. */ private static final int SCHEME_COLON = 0; + /** * An index into an array returned by {@link #getUriIndices(String)}. * @@ -42,6 +44,7 @@ public final class UriUtil { * authority part is non-empty (in this case the double-slash means the first segment is empty). */ private static final int PATH = 1; + /** * An index into an array returned by {@link #getUriIndices(String)}. * @@ -50,6 +53,7 @@ public final class UriUtil { * single '?' with no data. */ private static final int QUERY = 2; + /** * An index into an array returned by {@link #getUriIndices(String)}. * diff --git a/libraries/container/src/main/java/androidx/media3/container/MdtaMetadataEntry.java b/libraries/container/src/main/java/androidx/media3/container/MdtaMetadataEntry.java index 293fb565fb..9714f77eb9 100644 --- a/libraries/container/src/main/java/androidx/media3/container/MdtaMetadataEntry.java +++ b/libraries/container/src/main/java/androidx/media3/container/MdtaMetadataEntry.java @@ -35,17 +35,22 @@ public final class MdtaMetadataEntry implements Metadata.Entry { /** The type indicator for UTF-8 string. */ public static final int TYPE_INDICATOR_STRING = 1; + /** The type indicator for Float32. */ public static final int TYPE_INDICATOR_FLOAT32 = 23; + /** The type indicator for 32-bit signed integer. */ public static final int TYPE_INDICATOR_INT32 = 67; /** The metadata key name. */ public final String key; + /** The payload. The interpretation of the value depends on {@link #typeIndicator}. */ public final byte[] value; + /** The four byte locale indicator. */ public final int localeIndicator; + /** The four byte type indicator. */ public final int typeIndicator; diff --git a/libraries/container/src/main/java/androidx/media3/container/Mp4TimestampData.java b/libraries/container/src/main/java/androidx/media3/container/Mp4TimestampData.java index a2d6f442db..92c1ad5b81 100644 --- a/libraries/container/src/main/java/androidx/media3/container/Mp4TimestampData.java +++ b/libraries/container/src/main/java/androidx/media3/container/Mp4TimestampData.java @@ -31,8 +31,10 @@ public final class Mp4TimestampData implements Metadata.Entry { /** The creation timestamp. */ public final long creationTimestampSeconds; + /** The modification timestamp. */ public final long modificationTimestampSeconds; + /** The timescale of the movie. */ public final long timescale; diff --git a/libraries/container/src/main/java/androidx/media3/container/NalUnitUtil.java b/libraries/container/src/main/java/androidx/media3/container/NalUnitUtil.java index 5889e8152a..18d4123c15 100644 --- a/libraries/container/src/main/java/androidx/media3/container/NalUnitUtil.java +++ b/libraries/container/src/main/java/androidx/media3/container/NalUnitUtil.java @@ -36,16 +36,22 @@ public final class NalUnitUtil { /** Coded slice of a non-IDR picture. */ public static final int NAL_UNIT_TYPE_NON_IDR = 1; + /** Coded slice data partition A. */ public static final int NAL_UNIT_TYPE_PARTITION_A = 2; + /** Coded slice of an IDR picture. */ public static final int NAL_UNIT_TYPE_IDR = 5; + /** Supplemental enhancement information. */ public static final int NAL_UNIT_TYPE_SEI = 6; + /** Sequence parameter set. */ public static final int NAL_UNIT_TYPE_SPS = 7; + /** Picture parameter set. */ public static final int NAL_UNIT_TYPE_PPS = 8; + /** Access unit delimiter. */ public static final int NAL_UNIT_TYPE_AUD = 9; @@ -186,6 +192,7 @@ public final class NalUnitUtil { /** Value for aspect_ratio_idc indicating an extended aspect ratio, in H.264 and H.265 SPSs. */ public static final int EXTENDED_SAR = 0xFF; + /** Aspect ratios indexed by aspect_ratio_idc, in H.264 and H.265 SPSs. */ public static final float[] ASPECT_RATIO_IDC_VALUES = new float[] { diff --git a/libraries/database/src/main/java/androidx/media3/database/VersionTable.java b/libraries/database/src/main/java/androidx/media3/database/VersionTable.java index 74be07e9b7..5fae2e1242 100644 --- a/libraries/database/src/main/java/androidx/media3/database/VersionTable.java +++ b/libraries/database/src/main/java/androidx/media3/database/VersionTable.java @@ -43,12 +43,16 @@ public final class VersionTable { /** Returned by {@link #getVersion(SQLiteDatabase, int, String)} if the version is unset. */ public static final int VERSION_UNSET = -1; + /** Version of tables used for offline functionality. */ public static final int FEATURE_OFFLINE = 0; + /** Version of tables used for cache content metadata. */ public static final int FEATURE_CACHE_CONTENT_METADATA = 1; + /** Version of tables used for cache file metadata. */ public static final int FEATURE_CACHE_FILE_METADATA = 2; + /** Version of tables used from external features. */ public static final int FEATURE_EXTERNAL = 1000; diff --git a/libraries/datasource/src/main/java/androidx/media3/datasource/DataSpec.java b/libraries/datasource/src/main/java/androidx/media3/datasource/DataSpec.java index bbaf39f0f9..2b858ded0f 100644 --- a/libraries/datasource/src/main/java/androidx/media3/datasource/DataSpec.java +++ b/libraries/datasource/src/main/java/androidx/media3/datasource/DataSpec.java @@ -259,6 +259,7 @@ public final class DataSpec { FLAG_MIGHT_NOT_USE_FULL_NETWORK_SPEED }) public @interface Flags {} + /** * Allows an underlying network stack to request that the server use gzip compression. * @@ -271,8 +272,10 @@ public final class DataSpec { * DataSource#read(byte[], int, int)} will be the decompressed data. */ public static final int FLAG_ALLOW_GZIP = 1; + /** Prevents caching if the length cannot be resolved when the {@link DataSource} is opened. */ public static final int FLAG_DONT_CACHE_IF_LENGTH_UNKNOWN = 1 << 1; + /** * Allows fragmentation of this request into multiple cache files, meaning a cache eviction policy * will be able to evict individual fragments of the data. Depending on the cache implementation, @@ -280,6 +283,7 @@ public final class DataSpec { * whilst writing another). */ public static final int FLAG_ALLOW_CACHE_FRAGMENTATION = 1 << 2; + /** * Indicates there are known external factors that might prevent the data from being loaded at * full network speed (e.g. server throttling or unfinished live media chunks). @@ -295,10 +299,13 @@ public final class DataSpec { @Target(TYPE_USE) @IntDef({HTTP_METHOD_GET, HTTP_METHOD_POST, HTTP_METHOD_HEAD}) public @interface HttpMethod {} + /** HTTP GET method. */ public static final int HTTP_METHOD_GET = 1; + /** HTTP POST method. */ public static final int HTTP_METHOD_POST = 2; + /** HTTP HEAD method. */ public static final int HTTP_METHOD_HEAD = 3; diff --git a/libraries/datasource/src/main/java/androidx/media3/datasource/DefaultHttpDataSource.java b/libraries/datasource/src/main/java/androidx/media3/datasource/DefaultHttpDataSource.java index e29963f8ed..4e1a6b08e1 100644 --- a/libraries/datasource/src/main/java/androidx/media3/datasource/DefaultHttpDataSource.java +++ b/libraries/datasource/src/main/java/androidx/media3/datasource/DefaultHttpDataSource.java @@ -220,6 +220,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou /** The default connection timeout, in milliseconds. */ @UnstableApi public static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 8 * 1000; + /** The default read timeout, in milliseconds. */ @UnstableApi public static final int DEFAULT_READ_TIMEOUT_MILLIS = 8 * 1000; diff --git a/libraries/datasource/src/main/java/androidx/media3/datasource/HttpDataSource.java b/libraries/datasource/src/main/java/androidx/media3/datasource/HttpDataSource.java index ac54956a08..5716eb4776 100644 --- a/libraries/datasource/src/main/java/androidx/media3/datasource/HttpDataSource.java +++ b/libraries/datasource/src/main/java/androidx/media3/datasource/HttpDataSource.java @@ -204,8 +204,10 @@ public interface HttpDataSource extends DataSource { /** The error occurred reading data from a {@code HttpDataSource}. */ public static final int TYPE_OPEN = 1; + /** The error occurred in opening a {@code HttpDataSource}. */ public static final int TYPE_READ = 2; + /** The error occurred in closing a {@code HttpDataSource}. */ public static final int TYPE_CLOSE = 3; diff --git a/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheDataSink.java b/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheDataSink.java index d87fcfdacc..2e05953185 100644 --- a/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheDataSink.java +++ b/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheDataSink.java @@ -122,6 +122,7 @@ public final class CacheDataSink implements DataSink { /** Default {@code fragmentSize} recommended for caching use cases. */ public static final long DEFAULT_FRAGMENT_SIZE = 5 * 1024 * 1024; + /** Default buffer size in bytes. */ public static final int DEFAULT_BUFFER_SIZE = 20 * 1024; diff --git a/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheDataSource.java b/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheDataSource.java index f0c8788c1f..e4c665229f 100644 --- a/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheDataSource.java +++ b/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheDataSource.java @@ -355,6 +355,7 @@ public final class CacheDataSource implements DataSource { FLAG_IGNORE_CACHE_FOR_UNSET_LENGTH_REQUESTS }) public @interface Flags {} + /** * A flag indicating whether we will block reads if the cache key is locked. If unset then data is * read from upstream if the cache key is locked, regardless of whether the data is cached. diff --git a/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheSpan.java b/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheSpan.java index 869ff066f7..bb5ff0be62 100644 --- a/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheSpan.java +++ b/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheSpan.java @@ -26,16 +26,21 @@ public class CacheSpan implements Comparable { /** The cache key that uniquely identifies the resource. */ public final String key; + /** The position of the {@link CacheSpan} in the resource. */ public final long position; + /** * The length of the {@link CacheSpan}, or {@link C#LENGTH_UNSET} if this is an open-ended hole. */ public final long length; + /** Whether the {@link CacheSpan} is cached. */ public final boolean isCached; + /** The file corresponding to this {@link CacheSpan}, or null if {@link #isCached} is false. */ @Nullable public final File file; + /** The last touch timestamp, or {@link C#TIME_UNSET} if {@link #isCached} is false. */ public final long lastTouchTimestamp; diff --git a/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CachedContent.java b/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CachedContent.java index 4349c1f31c..5cf85dc81a 100644 --- a/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CachedContent.java +++ b/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CachedContent.java @@ -35,10 +35,13 @@ import java.util.TreeSet; /** The cache id that uniquely identifies the resource. */ public final int id; + /** The cache key that uniquely identifies the resource. */ public final String key; + /** The cached spans of this content. */ private final TreeSet cachedSpans; + /** Currently locked ranges. */ private final ArrayList lockedRanges; @@ -280,6 +283,7 @@ import java.util.TreeSet; /** The starting position of the range. */ public final long position; + /** The length of the range, or {@link C#LENGTH_UNSET} if unbounded. */ public final long length; diff --git a/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CachedContentIndex.java b/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CachedContentIndex.java index ad1ef1410b..bfb2a02e5e 100644 --- a/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CachedContentIndex.java +++ b/libraries/datasource/src/main/java/androidx/media3/datasource/cache/CachedContentIndex.java @@ -74,6 +74,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private static final int INCREMENTAL_METADATA_READ_LENGTH = 10 * 1024 * 1024; private final HashMap keyToContent; + /** * Maps assigned ids to their corresponding keys. Also contains (id -> null) entries for ids that * have been removed from the index since it was last stored. This prevents reuse of these ids, @@ -92,11 +93,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * reuse. */ private final SparseArray<@NullableType String> idToKey; + /** * Tracks ids for which (id -> null) entries are present in idToKey, so that they can be removed * efficiently when the index is next stored. */ private final SparseBooleanArray removedIds; + /** Tracks ids that are new since the index was last stored. */ private final SparseBooleanArray newIds; diff --git a/libraries/datasource/src/main/java/androidx/media3/datasource/cache/ContentMetadata.java b/libraries/datasource/src/main/java/androidx/media3/datasource/cache/ContentMetadata.java index d7a63c2a35..e04100b8b3 100644 --- a/libraries/datasource/src/main/java/androidx/media3/datasource/cache/ContentMetadata.java +++ b/libraries/datasource/src/main/java/androidx/media3/datasource/cache/ContentMetadata.java @@ -30,8 +30,10 @@ public interface ContentMetadata { */ @SuppressWarnings("unused") String KEY_CUSTOM_PREFIX = "custom_"; + /** Key for redirected uri (type: String). */ String KEY_REDIRECTED_URI = "exo_redir"; + /** Key for content length in bytes (type: long). */ String KEY_CONTENT_LENGTH = "exo_len"; diff --git a/libraries/datasource/src/main/java/androidx/media3/datasource/cache/SimpleCache.java b/libraries/datasource/src/main/java/androidx/media3/datasource/cache/SimpleCache.java index a6268598a1..44dde6ce66 100644 --- a/libraries/datasource/src/main/java/androidx/media3/datasource/cache/SimpleCache.java +++ b/libraries/datasource/src/main/java/androidx/media3/datasource/cache/SimpleCache.java @@ -51,6 +51,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; public final class SimpleCache implements Cache { private static final String TAG = "SimpleCache"; + /** * Cache files are distributed between a number of subdirectories. This helps to avoid poor * performance in cases where the performance of the underlying file system (e.g. FAT32) scales diff --git a/libraries/datasource_cronet/src/main/java/androidx/media3/datasource/cronet/CronetDataSource.java b/libraries/datasource_cronet/src/main/java/androidx/media3/datasource/cronet/CronetDataSource.java index e5d93dab8f..a5ed7457b2 100644 --- a/libraries/datasource_cronet/src/main/java/androidx/media3/datasource/cronet/CronetDataSource.java +++ b/libraries/datasource_cronet/src/main/java/androidx/media3/datasource/cronet/CronetDataSource.java @@ -415,6 +415,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { /** The default connection timeout, in milliseconds. */ @UnstableApi public static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 8 * 1000; + /** The default read timeout, in milliseconds. */ @UnstableApi public static final int DEFAULT_READ_TIMEOUT_MILLIS = 8 * 1000; diff --git a/libraries/decoder/src/main/java/androidx/media3/decoder/CryptoInfo.java b/libraries/decoder/src/main/java/androidx/media3/decoder/CryptoInfo.java index 8ddaef5d9b..ba7131b321 100644 --- a/libraries/decoder/src/main/java/androidx/media3/decoder/CryptoInfo.java +++ b/libraries/decoder/src/main/java/androidx/media3/decoder/CryptoInfo.java @@ -37,18 +37,21 @@ public final class CryptoInfo { * @see android.media.MediaCodec.CryptoInfo#iv */ @Nullable public byte[] iv; + /** * The 16 byte key id. * * @see android.media.MediaCodec.CryptoInfo#key */ @Nullable public byte[] key; + /** * The type of encryption that has been applied. Must be one of the {@link C.CryptoMode} values. * * @see android.media.MediaCodec.CryptoInfo#mode */ public @C.CryptoMode int mode; + /** * The number of leading unencrypted bytes in each sub-sample. If null, all bytes are treated as * encrypted and {@link #numBytesOfEncryptedData} must be specified. @@ -56,6 +59,7 @@ public final class CryptoInfo { * @see android.media.MediaCodec.CryptoInfo#numBytesOfClearData */ @Nullable public int[] numBytesOfClearData; + /** * The number of trailing encrypted bytes in each sub-sample. If null, all bytes are treated as * clear and {@link #numBytesOfClearData} must be specified. @@ -63,16 +67,19 @@ public final class CryptoInfo { * @see android.media.MediaCodec.CryptoInfo#numBytesOfEncryptedData */ @Nullable public int[] numBytesOfEncryptedData; + /** * The number of subSamples that make up the buffer's contents. * * @see android.media.MediaCodec.CryptoInfo#numSubSamples */ public int numSubSamples; + /** * @see android.media.MediaCodec.CryptoInfo.Pattern */ public int encryptedBlocks; + /** * @see android.media.MediaCodec.CryptoInfo.Pattern */ diff --git a/libraries/decoder/src/main/java/androidx/media3/decoder/DecoderInputBuffer.java b/libraries/decoder/src/main/java/androidx/media3/decoder/DecoderInputBuffer.java index 265e2b0685..ced6ffb1a2 100644 --- a/libraries/decoder/src/main/java/androidx/media3/decoder/DecoderInputBuffer.java +++ b/libraries/decoder/src/main/java/androidx/media3/decoder/DecoderInputBuffer.java @@ -47,6 +47,7 @@ public class DecoderInputBuffer extends Buffer { /** The current capacity of the buffer. */ public final int currentCapacity; + /** The required capacity of the buffer. */ public final int requiredCapacity; @@ -78,10 +79,13 @@ public class DecoderInputBuffer extends Buffer { BUFFER_REPLACEMENT_MODE_DIRECT }) public @interface BufferReplacementMode {} + /** Disallows buffer replacement. */ public static final int BUFFER_REPLACEMENT_MODE_DISABLED = 0; + /** Allows buffer replacement using {@link ByteBuffer#allocate(int)}. */ public static final int BUFFER_REPLACEMENT_MODE_NORMAL = 1; + /** Allows buffer replacement using {@link ByteBuffer#allocateDirect(int)}. */ public static final int BUFFER_REPLACEMENT_MODE_DIRECT = 2; diff --git a/libraries/decoder/src/main/java/androidx/media3/decoder/VideoDecoderOutputBuffer.java b/libraries/decoder/src/main/java/androidx/media3/decoder/VideoDecoderOutputBuffer.java index b0fb72294b..9113197614 100644 --- a/libraries/decoder/src/main/java/androidx/media3/decoder/VideoDecoderOutputBuffer.java +++ b/libraries/decoder/src/main/java/androidx/media3/decoder/VideoDecoderOutputBuffer.java @@ -35,11 +35,13 @@ public class VideoDecoderOutputBuffer extends DecoderOutputBuffer { /** Output mode. */ public @C.VideoOutputMode int mode; + /** RGB buffer for RGB mode. */ @Nullable public ByteBuffer data; public int width; public int height; + /** The format of the input from which this output buffer was decoded. */ @Nullable public Format format; diff --git a/libraries/decoder_av1/src/main/java/androidx/media3/decoder/av1/Libgav1VideoRenderer.java b/libraries/decoder_av1/src/main/java/androidx/media3/decoder/av1/Libgav1VideoRenderer.java index 14ae84f868..68a38bb2a1 100644 --- a/libraries/decoder_av1/src/main/java/androidx/media3/decoder/av1/Libgav1VideoRenderer.java +++ b/libraries/decoder_av1/src/main/java/androidx/media3/decoder/av1/Libgav1VideoRenderer.java @@ -47,6 +47,7 @@ public class Libgav1VideoRenderer extends DecoderVideoRenderer { private static final String TAG = "Libgav1VideoRenderer"; private static final int DEFAULT_NUM_OF_INPUT_BUFFERS = 4; private static final int DEFAULT_NUM_OF_OUTPUT_BUFFERS = 4; + /** * Default input buffer size in bytes, based on 720p resolution video compressed by a factor of * two. @@ -56,6 +57,7 @@ public class Libgav1VideoRenderer extends DecoderVideoRenderer { /** The number of input buffers. */ private final int numInputBuffers; + /** * The number of output buffers. The renderer may limit the minimum possible value due to * requiring multiple output buffers to be dequeued at a time for it to make progress. diff --git a/libraries/decoder_ffmpeg/src/main/java/androidx/media3/decoder/ffmpeg/FfmpegAudioRenderer.java b/libraries/decoder_ffmpeg/src/main/java/androidx/media3/decoder/ffmpeg/FfmpegAudioRenderer.java index 9cfc9b3e3c..421d3adac0 100644 --- a/libraries/decoder_ffmpeg/src/main/java/androidx/media3/decoder/ffmpeg/FfmpegAudioRenderer.java +++ b/libraries/decoder_ffmpeg/src/main/java/androidx/media3/decoder/ffmpeg/FfmpegAudioRenderer.java @@ -44,6 +44,7 @@ public final class FfmpegAudioRenderer extends DecoderAudioRenderer { throws MidiDecoderException { return new MidiDecoder(context); } + /** * {@inheritDoc} * diff --git a/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/TrackEvent.java b/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/TrackEvent.java index 5951642b5b..0dca5d33bb 100644 --- a/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/TrackEvent.java +++ b/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/TrackEvent.java @@ -32,6 +32,7 @@ import androidx.media3.common.util.UnstableApi; /** The length of a MIDI event message in bytes. */ public static final int MIDI_MESSAGE_LENGTH_BYTES = 3; + /** A default or unset data value. */ public static final int DATA_FIELD_UNSET = Integer.MIN_VALUE; diff --git a/libraries/decoder_opus/src/main/java/androidx/media3/decoder/opus/LibopusAudioRenderer.java b/libraries/decoder_opus/src/main/java/androidx/media3/decoder/opus/LibopusAudioRenderer.java index 100389ef33..a31bdc523d 100644 --- a/libraries/decoder_opus/src/main/java/androidx/media3/decoder/opus/LibopusAudioRenderer.java +++ b/libraries/decoder_opus/src/main/java/androidx/media3/decoder/opus/LibopusAudioRenderer.java @@ -35,8 +35,10 @@ import androidx.media3.exoplayer.audio.DecoderAudioRenderer; public class LibopusAudioRenderer extends DecoderAudioRenderer { private static final String TAG = "LibopusAudioRenderer"; + /** The number of input and output buffers. */ private static final int NUM_BUFFERS = 16; + /** The default input buffer size. */ private static final int DEFAULT_INPUT_BUFFER_SIZE = 960 * 6; diff --git a/libraries/decoder_vp9/src/main/java/androidx/media3/decoder/vp9/LibvpxVideoRenderer.java b/libraries/decoder_vp9/src/main/java/androidx/media3/decoder/vp9/LibvpxVideoRenderer.java index 3f8130c1ad..76da83d405 100644 --- a/libraries/decoder_vp9/src/main/java/androidx/media3/decoder/vp9/LibvpxVideoRenderer.java +++ b/libraries/decoder_vp9/src/main/java/androidx/media3/decoder/vp9/LibvpxVideoRenderer.java @@ -41,11 +41,13 @@ public class LibvpxVideoRenderer extends DecoderVideoRenderer { /** The number of input buffers. */ private final int numInputBuffers; + /** * The number of output buffers. The renderer may limit the minimum possible value due to * requiring multiple output buffers to be dequeued at a time for it to make progress. */ private final int numOutputBuffers; + /** * The default input buffer size. The value is based on SoftVPX.cpp. diff --git a/libraries/effect/src/androidTest/java/androidx/media3/effect/DefaultVideoFrameProcessorVideoFrameRenderingTest.java b/libraries/effect/src/androidTest/java/androidx/media3/effect/DefaultVideoFrameProcessorVideoFrameRenderingTest.java index 204e3ce25c..48c13a2630 100644 --- a/libraries/effect/src/androidTest/java/androidx/media3/effect/DefaultVideoFrameProcessorVideoFrameRenderingTest.java +++ b/libraries/effect/src/androidTest/java/androidx/media3/effect/DefaultVideoFrameProcessorVideoFrameRenderingTest.java @@ -60,11 +60,13 @@ public final class DefaultVideoFrameProcessorVideoFrameRenderingTest { private static final int WIDTH = 200; private static final int HEIGHT = 100; + /** * Time to wait between rendering frames to avoid frame drops between GL and the {@link * ImageReader}. */ private static final long PER_FRAME_RENDERING_WAIT_TIME_MS = 1000L; + /** Maximum time to wait for each rendered frame to be notified. */ private static final long PER_FRAME_TIMEOUT_MS = 5000L; diff --git a/libraries/effect/src/main/java/androidx/media3/effect/DefaultShaderProgram.java b/libraries/effect/src/main/java/androidx/media3/effect/DefaultShaderProgram.java index f7fa79bcd0..bb740cffb9 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/DefaultShaderProgram.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/DefaultShaderProgram.java @@ -101,27 +101,34 @@ import java.util.List; /** The {@link MatrixTransformation MatrixTransformations} to apply. */ private final ImmutableList matrixTransformations; + /** The {@link RgbMatrix RgbMatrices} to apply. */ private final ImmutableList rgbMatrices; + /** Whether the frame is in HDR or not. */ private final boolean useHdr; + /** * The transformation matrices provided by the {@link MatrixTransformation MatrixTransformations} * for the most recent frame. */ private final float[][] transformationMatrixCache; + /** The RGB matrices provided by the {@link RgbMatrix RgbMatrices} for the most recent frame. */ private final float[][] rgbMatrixCache; + /** * The product of the {@link #transformationMatrixCache} for the most recent frame, to be applied * in the vertex shader. */ private final float[] compositeTransformationMatrixArray; + /** * The product of the {@link #rgbMatrixCache} for the most recent frame, to be applied in the * fragment shader. */ private final float[] compositeRgbMatrixArray; + /** Matrix for storing an intermediate calculation result. */ private final float[] tempResultMatrix; diff --git a/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoFrameProcessor.java b/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoFrameProcessor.java index e4b56e3304..4d0c11654d 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoFrameProcessor.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoFrameProcessor.java @@ -297,6 +297,7 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor { // Shader programs that apply Effects. private final List intermediateGlShaderPrograms; + // Whether DefaultVideoFrameProcessor is currently processing an input stream. @GuardedBy("lock") private boolean processingInput; diff --git a/libraries/effect/src/main/java/androidx/media3/effect/ExternalTextureManager.java b/libraries/effect/src/main/java/androidx/media3/effect/ExternalTextureManager.java index 21d5d1c11a..558b9583b1 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/ExternalTextureManager.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/ExternalTextureManager.java @@ -44,6 +44,7 @@ import java.util.concurrent.atomic.AtomicInteger; private static final String TAG = "ExtTexMgr"; private static final String TIMER_THREAD_NAME = "ExtTexMgr:Timer"; + /** * The time out in milliseconds after calling signalEndOfCurrentInputStream after which the input * stream is considered to have ended, even if not all expected frames have been received from the diff --git a/libraries/effect/src/main/java/androidx/media3/effect/HslAdjustment.java b/libraries/effect/src/main/java/androidx/media3/effect/HslAdjustment.java index 786129a8d0..9de8ff16c9 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/HslAdjustment.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/HslAdjustment.java @@ -101,8 +101,10 @@ public class HslAdjustment implements GlEffect { /** Indicates the hue adjustment in degrees. */ public final float hueAdjustmentDegrees; + /** Indicates the saturation adjustment. */ public final float saturationAdjustment; + /** Indicates the lightness adjustment. */ public final float lightnessAdjustment; diff --git a/libraries/effect/src/main/java/androidx/media3/effect/OverlaySettings.java b/libraries/effect/src/main/java/androidx/media3/effect/OverlaySettings.java index 2cdb5d2f07..eaa6919304 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/OverlaySettings.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/OverlaySettings.java @@ -1,4 +1,5 @@ package androidx.media3.effect; + /* * Copyright 2022 The Android Open Source Project * diff --git a/libraries/effect/src/main/java/androidx/media3/effect/Presentation.java b/libraries/effect/src/main/java/androidx/media3/effect/Presentation.java index 6483e0ac55..cf49c7d5bf 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/Presentation.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/Presentation.java @@ -55,6 +55,7 @@ public final class Presentation implements MatrixTransformation { @Target(TYPE_USE) @IntDef({LAYOUT_SCALE_TO_FIT, LAYOUT_SCALE_TO_FIT_WITH_CROP, LAYOUT_STRETCH_TO_FIT}) public @interface Layout {} + /** * Empty pixels added above and below the input frame (for letterboxing), or to the left and right * of the input frame (for pillarboxing), until the desired aspect ratio is achieved. All input @@ -70,6 +71,7 @@ public final class Presentation implements MatrixTransformation { * */ public static final int LAYOUT_SCALE_TO_FIT = 0; + /** * Pixels cropped from the input frame, until the desired aspect ratio is achieved. Pixels may be * cropped either from the bottom and top, or from the left and right sides, of the input frame. @@ -84,6 +86,7 @@ public final class Presentation implements MatrixTransformation { * */ public static final int LAYOUT_SCALE_TO_FIT_WITH_CROP = 1; + /** * Frame stretched larger on the x or y axes to fit the desired aspect ratio. * diff --git a/libraries/effect/src/main/java/androidx/media3/effect/RgbFilter.java b/libraries/effect/src/main/java/androidx/media3/effect/RgbFilter.java index 951d334e5c..c9d7a8902e 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/RgbFilter.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/RgbFilter.java @@ -48,6 +48,7 @@ public class RgbFilter implements RgbMatrix { }; private final int colorFilter; + /** * Ensures that the usage of HDR is consistent. {@code null} indicates that HDR has not yet been * set. diff --git a/libraries/effect/src/main/java/androidx/media3/effect/ScaleAndRotateTransformation.java b/libraries/effect/src/main/java/androidx/media3/effect/ScaleAndRotateTransformation.java index 45604d1741..06494e06b5 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/ScaleAndRotateTransformation.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/ScaleAndRotateTransformation.java @@ -97,8 +97,10 @@ public final class ScaleAndRotateTransformation implements MatrixTransformation /** The multiplier by which the frame will scale horizontally, along the x-axis. */ public final float scaleX; + /** The multiplier by which the frame will scale vertically, along the y-axis. */ public final float scaleY; + /** * The counterclockwise rotation, in degrees. The value should always be between 0 (included) and * 360 degrees (excluded). diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/AudioFocusManager.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/AudioFocusManager.java index 28ccfa2121..cc93255206 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/AudioFocusManager.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/AudioFocusManager.java @@ -71,10 +71,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; PLAYER_COMMAND_PLAY_WHEN_READY, }) public @interface PlayerCommand {} + /** Do not play. */ public static final int PLAYER_COMMAND_DO_NOT_PLAY = -1; + /** Do not play now. Wait for callback to play. */ public static final int PLAYER_COMMAND_WAIT_FOR_CALLBACK = 0; + /** Play freely. */ public static final int PLAYER_COMMAND_PLAY_WHEN_READY = 1; @@ -89,12 +92,16 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; AUDIO_FOCUS_STATE_LOSS_TRANSIENT_DUCK }) private @interface AudioFocusState {} + /** No audio focus is currently being held. */ private static final int AUDIO_FOCUS_STATE_NO_FOCUS = 0; + /** The requested audio focus is currently held. */ private static final int AUDIO_FOCUS_STATE_HAVE_FOCUS = 1; + /** Audio focus has been temporarily lost. */ private static final int AUDIO_FOCUS_STATE_LOSS_TRANSIENT = 2; + /** Audio focus has been temporarily lost, but playback may continue with reduced volume. */ private static final int AUDIO_FOCUS_STATE_LOSS_TRANSIENT_DUCK = 3; @@ -114,24 +121,29 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE }) private @interface AudioFocusGain {} + /** * @see AudioManager#AUDIOFOCUS_NONE */ @SuppressWarnings("InlinedApi") private static final int AUDIOFOCUS_NONE = AudioManager.AUDIOFOCUS_NONE; + /** * @see AudioManager#AUDIOFOCUS_GAIN */ private static final int AUDIOFOCUS_GAIN = AudioManager.AUDIOFOCUS_GAIN; + /** * @see AudioManager#AUDIOFOCUS_GAIN_TRANSIENT */ private static final int AUDIOFOCUS_GAIN_TRANSIENT = AudioManager.AUDIOFOCUS_GAIN_TRANSIENT; + /** * @see AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK */ private static final int AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK = AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK; + /** * @see AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE */ diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DecoderCounters.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DecoderCounters.java index 954884027b..669249ef5e 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DecoderCounters.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DecoderCounters.java @@ -32,18 +32,23 @@ public final class DecoderCounters { /** The number of times a decoder has been initialized. */ public int decoderInitCount; + /** The number of times a decoder has been released. */ public int decoderReleaseCount; + /** The number of input buffers queued to the decoder. */ public int queuedInputBufferCount; + /** * The number of skipped input buffers. * *

A skipped input buffer is an input buffer that was deliberately not queued to the decoder. */ public int skippedInputBufferCount; + /** The number of rendered output buffers. */ public int renderedOutputBufferCount; + /** * The number of skipped output buffers. * @@ -52,6 +57,7 @@ public final class DecoderCounters { * the codec due to a flush. */ public int skippedOutputBufferCount; + /** * The number of dropped buffers. * @@ -62,6 +68,7 @@ public final class DecoderCounters { * being queued to the decoder. */ public int droppedBufferCount; + /** * The number of input buffers dropped. * @@ -69,12 +76,14 @@ public final class DecoderCounters { * be rendered in time. */ public int droppedInputBufferCount; + /** * The maximum number of dropped buffers without an interleaving rendered output buffer. * *

Skipped buffers are ignored for the purposes of calculating this value. */ public int maxConsecutiveDroppedBufferCount; + /** * The number of times all buffers to a keyframe were dropped. * @@ -90,6 +99,7 @@ public final class DecoderCounters { * */ public int droppedToKeyframeCount; + /** * The sum of the video frame processing offsets in microseconds. * @@ -103,6 +113,7 @@ public final class DecoderCounters { * updating it directly. */ public long totalVideoFrameProcessingOffsetUs; + /** * The number of video frame processing offsets added. * diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DecoderReuseEvaluation.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DecoderReuseEvaluation.java index e56b172b50..95771c00ce 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DecoderReuseEvaluation.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DecoderReuseEvaluation.java @@ -47,15 +47,19 @@ public final class DecoderReuseEvaluation { REUSE_RESULT_YES_WITHOUT_RECONFIGURATION }) public @interface DecoderReuseResult {} + /** The decoder cannot be reused. */ public static final int REUSE_RESULT_NO = 0; + /** The decoder can be reused, but must be flushed. */ public static final int REUSE_RESULT_YES_WITH_FLUSH = 1; + /** * The decoder can be reused. It does not need to be flushed, but must be reconfigured by * prefixing the next input buffer with the new format's configuration data. */ public static final int REUSE_RESULT_YES_WITH_RECONFIGURATION = 2; + /** The decoder can be kept. It does not need to be flushed and no reconfiguration is required. */ public static final int REUSE_RESULT_YES_WITHOUT_RECONFIGURATION = 3; @@ -87,34 +91,49 @@ public final class DecoderReuseEvaluation { /** Decoder reuse is not implemented. */ public static final int DISCARD_REASON_REUSE_NOT_IMPLEMENTED = 1 << 0; + /** Decoder reuse is disabled by a workaround. */ public static final int DISCARD_REASON_WORKAROUND = 1 << 1; + /** Decoder reuse is disabled by overriding behavior in application code. */ public static final int DISCARD_REASON_APP_OVERRIDE = 1 << 2; + /** The sample MIME type is changing. */ public static final int DISCARD_REASON_MIME_TYPE_CHANGED = 1 << 3; + /** The codec's operating rate is changing. */ public static final int DISCARD_REASON_OPERATING_RATE_CHANGED = 1 << 4; + /** The format initialization data is changing. */ public static final int DISCARD_REASON_INITIALIZATION_DATA_CHANGED = 1 << 5; + /** The new format may exceed the decoder's configured maximum sample size, in bytes. */ public static final int DISCARD_REASON_MAX_INPUT_SIZE_EXCEEDED = 1 << 6; + /** The DRM session is changing. */ public static final int DISCARD_REASON_DRM_SESSION_CHANGED = 1 << 7; + /** The new format may exceed the decoder's configured maximum resolution. */ public static final int DISCARD_REASON_VIDEO_MAX_RESOLUTION_EXCEEDED = 1 << 8; + /** The video resolution is changing. */ public static final int DISCARD_REASON_VIDEO_RESOLUTION_CHANGED = 1 << 9; + /** The video rotation is changing. */ public static final int DISCARD_REASON_VIDEO_ROTATION_CHANGED = 1 << 10; + /** The video {@link ColorInfo} is changing. */ public static final int DISCARD_REASON_VIDEO_COLOR_INFO_CHANGED = 1 << 11; + /** The audio channel count is changing. */ public static final int DISCARD_REASON_AUDIO_CHANNEL_COUNT_CHANGED = 1 << 12; + /** The audio sample rate is changing. */ public static final int DISCARD_REASON_AUDIO_SAMPLE_RATE_CHANGED = 1 << 13; + /** The audio encoding is changing. */ public static final int DISCARD_REASON_AUDIO_ENCODING_CHANGED = 1 << 14; + /** The audio bypass mode is possible. */ public static final int DISCARD_REASON_AUDIO_BYPASS_POSSIBLE = 1 << 15; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRenderersFactory.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRenderersFactory.java index 4c13fb101a..fd23bfd88e 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRenderersFactory.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRenderersFactory.java @@ -68,8 +68,10 @@ public class DefaultRenderersFactory implements RenderersFactory { @Target(TYPE_USE) @IntDef({EXTENSION_RENDERER_MODE_OFF, EXTENSION_RENDERER_MODE_ON, EXTENSION_RENDERER_MODE_PREFER}) public @interface ExtensionRendererMode {} + /** Do not allow use of extension renderers. */ public static final int EXTENSION_RENDERER_MODE_OFF = 0; + /** * Allow use of extension renderers. Extension renderers are indexed after core renderers of the * same type. A {@link TrackSelector} that prefers the first suitable renderer will therefore @@ -77,6 +79,7 @@ public class DefaultRenderersFactory implements RenderersFactory { * given track. */ public static final int EXTENSION_RENDERER_MODE_ON = 1; + /** * Allow use of extension renderers. Extension renderers are indexed before core renderers of the * same type. A {@link TrackSelector} that prefers the first suitable renderer will therefore diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlaybackException.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlaybackException.java index 3dc08580af..f8eeb6d9d8 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlaybackException.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlaybackException.java @@ -58,24 +58,28 @@ public final class ExoPlaybackException extends PlaybackException { @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({TYPE_SOURCE, TYPE_RENDERER, TYPE_UNEXPECTED, TYPE_REMOTE}) public @interface Type {} + /** * The error occurred loading data from a {@link MediaSource}. * *

Call {@link #getSourceException()} to retrieve the underlying cause. */ @UnstableApi public static final int TYPE_SOURCE = 0; + /** * The error occurred in a {@link Renderer}. * *

Call {@link #getRendererException()} to retrieve the underlying cause. */ @UnstableApi public static final int TYPE_RENDERER = 1; + /** * The error was an unexpected {@link RuntimeException}. * *

Call {@link #getUnexpectedException()} to retrieve the underlying cause. */ @UnstableApi public static final int TYPE_UNEXPECTED = 2; + /** * The error occurred in a remote component. * diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java index a0bfdc20a9..7de18e287a 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java @@ -143,6 +143,7 @@ import java.util.concurrent.TimeoutException; * operation. */ /* package */ final TrackSelectorResult emptyTrackSelectorResult; + /* package */ final Commands permanentAvailableCommands; private final ConditionVariable constructorFinished; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java index 30d1aa433b..ec3c33f5ee 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java @@ -169,6 +169,7 @@ import java.util.concurrent.atomic.AtomicBoolean; private static final int ACTIVE_INTERVAL_MS = 10; private static final int IDLE_INTERVAL_MS = 1000; + /** * Duration for which the player needs to appear stuck before the playback is failed on the * assumption that no further progress will be made. To appear stuck, the player's renderers must @@ -176,6 +177,7 @@ import java.util.concurrent.atomic.AtomicBoolean; * to load it. */ private static final long PLAYBACK_STUCK_AFTER_MS = 4000; + /** * Threshold under which a buffered duration is assumed to be empty. We cannot use zero to account * for buffers currently hold but not played by the renderer. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoTimeoutException.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoTimeoutException.java index 06dd0f9ff7..c7f324da74 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoTimeoutException.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoTimeoutException.java @@ -54,10 +54,13 @@ public final class ExoTimeoutException extends RuntimeException { /** The operation where this error occurred is not defined. */ public static final int TIMEOUT_OPERATION_UNDEFINED = 0; + /** The error occurred in {@link Player#release}. */ public static final int TIMEOUT_OPERATION_RELEASE = 1; + /** The error occurred in {@link ExoPlayer#setForegroundMode}. */ public static final int TIMEOUT_OPERATION_SET_FOREGROUND_MODE = 2; + /** The error occurred while detaching a surface from the player. */ public static final int TIMEOUT_OPERATION_DETACH_SURFACE = 3; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaPeriodHolder.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaPeriodHolder.java index 1554c096ca..8a2d3aa419 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaPeriodHolder.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaPeriodHolder.java @@ -42,8 +42,10 @@ import androidx.media3.exoplayer.upstream.Allocator; /** The {@link MediaPeriod} wrapped by this class. */ public final MediaPeriod mediaPeriod; + /** The unique timeline period identifier the media period belongs to. */ public final Object uid; + /** * The sample streams for each renderer associated with this period. May contain null elements. */ @@ -51,10 +53,13 @@ import androidx.media3.exoplayer.upstream.Allocator; /** Whether the media period has finished preparing. */ public boolean prepared; + /** Whether any of the tracks of this media period are enabled. */ public boolean hasEnabledTracks; + /** {@link MediaPeriodInfo} about this media period. */ public MediaPeriodInfo info; + /** * Whether all renderers are in the correct state for this {@link #mediaPeriod}. * diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaPeriodInfo.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaPeriodInfo.java index cd50c7e739..53c852fa4b 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaPeriodInfo.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaPeriodInfo.java @@ -27,8 +27,10 @@ import androidx.media3.exoplayer.source.MediaSource.MediaPeriodId; /** The media period's identifier. */ public final MediaPeriodId id; + /** The start position of the media to play within the media period, in microseconds. */ public final long startPositionUs; + /** * The requested next start position for the current timeline period, in microseconds, or {@link * C#TIME_UNSET} if the period was requested to start at its default position. @@ -37,6 +39,7 @@ import androidx.media3.exoplayer.source.MediaSource.MediaPeriodId; * suspended content. */ public final long requestedContentPositionUs; + /** * The end position to which the media period's content is clipped in order to play a following ad * group or to terminate a server side ad inserted stream before a played postroll, in @@ -45,25 +48,30 @@ import androidx.media3.exoplayer.source.MediaSource.MediaPeriodId; * of this content media period. */ public final long endPositionUs; + /** * The duration of the media period, like {@link #endPositionUs} but with {@link * C#TIME_END_OF_SOURCE} and {@link C#TIME_UNSET} resolved to the timeline period duration if * known. */ public final long durationUs; + /** * Whether this media period is followed by a transition to another media period of the same * server-side inserted ad stream. If true, {@link #isLastInTimelinePeriod}, {@link * #isLastInTimelineWindow} and {@link #isFinal} will all be false. */ public final boolean isFollowedByTransitionToSameStream; + /** * Whether this is the last media period in its timeline period (e.g., a postroll ad, or a media * period corresponding to a timeline period without ads). */ public final boolean isLastInTimelinePeriod; + /** Whether this is the last media period in its timeline window. */ public final boolean isLastInTimelineWindow; + /** * Whether this is the last media period in the entire timeline. If true, {@link * #isLastInTimelinePeriod} will also be true. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/PlaybackInfo.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/PlaybackInfo.java index 479c47ffa9..a4be60d383 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/PlaybackInfo.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/PlaybackInfo.java @@ -43,8 +43,10 @@ import java.util.List; /** The current {@link Timeline}. */ public final Timeline timeline; + /** The {@link MediaPeriodId} of the currently playing media period in the {@link #timeline}. */ public final MediaPeriodId periodId; + /** * The requested next start position for the current period in the {@link #timeline}, in * microseconds, or {@link C#TIME_UNSET} if the period was requested to start at its default @@ -54,28 +56,40 @@ import java.util.List; * suspended content. */ public final long requestedContentPositionUs; + /** The start position after a reported position discontinuity, in microseconds. */ public final long discontinuityStartPositionUs; + /** The current playback state. One of the {@link Player}.STATE_ constants. */ public final @Player.State int playbackState; + /** The current playback error, or null if this is not an error state. */ @Nullable public final ExoPlaybackException playbackError; + /** Whether the player is currently loading. */ public final boolean isLoading; + /** The currently available track groups. */ public final TrackGroupArray trackGroups; + /** The result of the current track selection. */ public final TrackSelectorResult trackSelectorResult; + /** The current static metadata of the track selections. */ public final List staticMetadata; + /** The {@link MediaPeriodId} of the currently loading media period in the {@link #timeline}. */ public final MediaPeriodId loadingMediaPeriodId; + /** Whether playback should proceed when {@link #playbackState} == {@link Player#STATE_READY}. */ public final boolean playWhenReady; + /** Reason why playback is suppressed even though {@link #playWhenReady} is {@code true}. */ public final @PlaybackSuppressionReason int playbackSuppressionReason; + /** The playback parameters. */ public final PlaybackParameters playbackParameters; + /** Whether the main player loop is sleeping, while using offload scheduling. */ public final boolean sleepingForOffload; @@ -84,16 +98,19 @@ import java.util.List; * of the associated period in the {@link #timeline}, in microseconds. */ public volatile long bufferedPositionUs; + /** * Total duration of buffered media from {@link #positionUs} to {@link #bufferedPositionUs} * including all ads. */ public volatile long totalBufferedDurationUs; + /** * Current playback position in {@link #periodId} relative to the start of the associated period * in the {@link #timeline}, in microseconds. */ public volatile long positionUs; + /** * The value of {@link SystemClock#elapsedRealtime()} when {@link #positionUs} was updated, in * milliseconds. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/Renderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/Renderer.java index fcfbcd3c66..e5de1f2eaf 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/Renderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/Renderer.java @@ -115,6 +115,7 @@ public interface Renderer extends PlayerMessage.Target { MSG_SET_VIDEO_OUTPUT_RESOLUTION }) public @interface MessageType {} + /** * The type of a message that can be passed to a video renderer via {@link * ExoPlayer#createMessage(PlayerMessage.Target)}. The message payload is normally a {@link @@ -125,12 +126,14 @@ public interface Renderer extends PlayerMessage.Target { * any existing output that it has. */ int MSG_SET_VIDEO_OUTPUT = 1; + /** * A type of a message that can be passed to an audio renderer via {@link * ExoPlayer#createMessage(PlayerMessage.Target)}. The message payload should be a {@link Float} * with 0 being silence and 1 being unity gain. */ int MSG_SET_VOLUME = 2; + /** * A type of a message that can be passed to an audio renderer via {@link * ExoPlayer#createMessage(PlayerMessage.Target)}. The message payload should be an {@link @@ -152,6 +155,7 @@ public interface Renderer extends PlayerMessage.Target { * an audio attributes instance. */ int MSG_SET_AUDIO_ATTRIBUTES = 3; + /** * The type of a message that can be passed to a {@link MediaCodec}-based video renderer via * {@link ExoPlayer#createMessage(PlayerMessage.Target)}. The message payload should be one of the @@ -161,36 +165,42 @@ public interface Renderer extends PlayerMessage.Target { * owned by a {@link android.view.SurfaceView}. */ int MSG_SET_SCALING_MODE = 4; + /** * The type of a message that can be passed to a video renderer via {@link * ExoPlayer#createMessage(PlayerMessage.Target)}. The message payload should be one of the * integer strategy constants in {@link C.VideoChangeFrameRateStrategy}. */ int MSG_SET_CHANGE_FRAME_RATE_STRATEGY = 5; + /** * A type of a message that can be passed to an audio renderer via {@link * ExoPlayer#createMessage(PlayerMessage.Target)}. The message payload should be an {@link * AuxEffectInfo} instance representing an auxiliary audio effect for the underlying audio track. */ int MSG_SET_AUX_EFFECT_INFO = 6; + /** * The type of a message that can be passed to a video renderer via {@link * ExoPlayer#createMessage(PlayerMessage.Target)}. The message payload should be a {@link * VideoFrameMetadataListener} instance, or null. */ int MSG_SET_VIDEO_FRAME_METADATA_LISTENER = 7; + /** * The type of a message that can be passed to a camera motion renderer via {@link * ExoPlayer#createMessage(PlayerMessage.Target)}. The message payload should be a {@link * CameraMotionListener} instance, or null. */ int MSG_SET_CAMERA_MOTION_LISTENER = 8; + /** * The type of a message that can be passed to an audio renderer via {@link * ExoPlayer#createMessage(PlayerMessage.Target)}. The message payload should be a {@link Boolean} * instance telling whether to enable or disable skipping silences in the audio stream. */ int MSG_SET_SKIP_SILENCE_ENABLED = 9; + /** * The type of a message that can be passed to audio and video renderers via {@link * ExoPlayer#createMessage(PlayerMessage.Target)}. The message payload should be an {@link @@ -199,6 +209,7 @@ public interface Renderer extends PlayerMessage.Target { * tunneling is enabled. */ int MSG_SET_AUDIO_SESSION_ID = 10; + /** * The type of a message that can be passed to a {@link Renderer} via {@link * ExoPlayer#createMessage(PlayerMessage.Target)}, to inform the renderer that it can schedule @@ -207,6 +218,7 @@ public interface Renderer extends PlayerMessage.Target { *

The message payload must be a {@link WakeupListener} instance. */ int MSG_SET_WAKEUP_LISTENER = 11; + /** * The type of a message that can be passed to audio renderers via {@link * ExoPlayer#createMessage(PlayerMessage.Target)}. The message payload should be an {@link @@ -214,17 +226,20 @@ public interface Renderer extends PlayerMessage.Target { * restore the default. */ int MSG_SET_PREFERRED_AUDIO_DEVICE = 12; + /** * The type of a message that can be passed to a video renderer. The message payload should be a * {@link List} containing {@linkplain Effect video effects}. */ int MSG_SET_VIDEO_EFFECTS = 13; + /** * The type of a message that can be passed to a video renderer to set the desired output * resolution. The message payload should be a {@link Size} of the desired output width and * height. Use this method only when playing with video {@linkplain Effect effects}. */ int MSG_SET_VIDEO_OUTPUT_RESOLUTION = 14; + /** * Applications or extensions may define custom {@code MSG_*} constants that can be passed to * renderers. These custom constants must be greater than or equal to this value. @@ -240,12 +255,14 @@ public interface Renderer extends PlayerMessage.Target { @Target(TYPE_USE) @IntDef({STATE_DISABLED, STATE_ENABLED, STATE_STARTED}) @interface State {} + /** * 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. {@link #reset()} can be called to force the renderer to release such resources. */ int STATE_DISABLED = 0; + /** * 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 @@ -253,6 +270,7 @@ public interface Renderer extends PlayerMessage.Target { * decoders). */ int STATE_ENABLED = 1; + /** * The renderer is started. Calls to {@link #render(long, long)} will cause media to be rendered. */ diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/RendererCapabilities.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/RendererCapabilities.java index 3839753266..62d1c6badc 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/RendererCapabilities.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/RendererCapabilities.java @@ -60,24 +60,30 @@ public interface RendererCapabilities { }) @Deprecated @interface FormatSupport {} + /** A mask to apply to {@link Capabilities} to obtain the {@link C.FormatSupport} only. */ int FORMAT_SUPPORT_MASK = 0b111; + /** * @deprecated Use {@link C#FORMAT_HANDLED} instead. */ @Deprecated int FORMAT_HANDLED = C.FORMAT_HANDLED; + /** * @deprecated Use {@link C#FORMAT_EXCEEDS_CAPABILITIES} instead. */ @Deprecated int FORMAT_EXCEEDS_CAPABILITIES = C.FORMAT_EXCEEDS_CAPABILITIES; + /** * @deprecated Use {@link C#FORMAT_UNSUPPORTED_DRM} instead. */ @Deprecated int FORMAT_UNSUPPORTED_DRM = C.FORMAT_UNSUPPORTED_DRM; + /** * @deprecated Use {@link C#FORMAT_UNSUPPORTED_SUBTYPE} instead. */ @Deprecated int FORMAT_UNSUPPORTED_SUBTYPE = C.FORMAT_UNSUPPORTED_SUBTYPE; + /** * @deprecated Use {@link C#FORMAT_UNSUPPORTED_TYPE} instead. */ @@ -95,13 +101,16 @@ public interface RendererCapabilities { /** 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; @@ -117,8 +126,10 @@ public interface RendererCapabilities { /** 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; @@ -136,10 +147,13 @@ public interface RendererCapabilities { 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; @@ -154,15 +168,19 @@ public interface RendererCapabilities { @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; @@ -187,15 +205,19 @@ public interface RendererCapabilities { 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; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/SeekParameters.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/SeekParameters.java index 2dbc495ba6..c355ca5ee5 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/SeekParameters.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/SeekParameters.java @@ -40,13 +40,17 @@ public final class SeekParameters { /** Parameters for exact seeking. */ public static final SeekParameters EXACT = new SeekParameters(0, 0); + /** Parameters for seeking to the closest sync point. */ public static final SeekParameters CLOSEST_SYNC = new SeekParameters(Long.MAX_VALUE, Long.MAX_VALUE); + /** Parameters for seeking to the sync point immediately before a requested seek position. */ public static final SeekParameters PREVIOUS_SYNC = new SeekParameters(Long.MAX_VALUE, 0); + /** Parameters for seeking to the sync point immediately after a requested seek position. */ public static final SeekParameters NEXT_SYNC = new SeekParameters(0, Long.MAX_VALUE); + /** Default parameters. */ public static final SeekParameters DEFAULT = EXACT; @@ -55,6 +59,7 @@ public final class SeekParameters { * microseconds. */ public final long toleranceBeforeUs; + /** * The maximum time that the actual position seeked to may exceed the requested seek position, in * microseconds. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java index 5cd62c18f8..41c3e9d12a 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java @@ -234,142 +234,204 @@ public interface AnalyticsListener { EVENT_VIDEO_CODEC_ERROR, }) @interface EventFlags {} + /** {@link Player#getCurrentTimeline()} changed. */ @UnstableApi int EVENT_TIMELINE_CHANGED = Player.EVENT_TIMELINE_CHANGED; + /** * {@link Player#getCurrentMediaItem()} changed or the player started repeating the current item. */ @UnstableApi int EVENT_MEDIA_ITEM_TRANSITION = Player.EVENT_MEDIA_ITEM_TRANSITION; + /** {@link Player#getCurrentTracks()} changed. */ @UnstableApi int EVENT_TRACKS_CHANGED = Player.EVENT_TRACKS_CHANGED; + /** {@link Player#isLoading()} ()} changed. */ @UnstableApi int EVENT_IS_LOADING_CHANGED = Player.EVENT_IS_LOADING_CHANGED; + /** {@link Player#getPlaybackState()} changed. */ @UnstableApi int EVENT_PLAYBACK_STATE_CHANGED = Player.EVENT_PLAYBACK_STATE_CHANGED; + /** {@link Player#getPlayWhenReady()} changed. */ @UnstableApi int EVENT_PLAY_WHEN_READY_CHANGED = Player.EVENT_PLAY_WHEN_READY_CHANGED; + /** {@link Player#getPlaybackSuppressionReason()} changed. */ @UnstableApi int EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED = Player.EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED; + /** {@link Player#isPlaying()} changed. */ @UnstableApi int EVENT_IS_PLAYING_CHANGED = Player.EVENT_IS_PLAYING_CHANGED; + /** {@link Player#getRepeatMode()} changed. */ @UnstableApi int EVENT_REPEAT_MODE_CHANGED = Player.EVENT_REPEAT_MODE_CHANGED; + /** {@link Player#getShuffleModeEnabled()} changed. */ @UnstableApi int EVENT_SHUFFLE_MODE_ENABLED_CHANGED = Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED; + /** {@link Player#getPlayerError()} changed. */ @UnstableApi int EVENT_PLAYER_ERROR = Player.EVENT_PLAYER_ERROR; + /** * A position discontinuity occurred. See {@link * Player.Listener#onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)}. */ @UnstableApi int EVENT_POSITION_DISCONTINUITY = Player.EVENT_POSITION_DISCONTINUITY; + /** {@link Player#getPlaybackParameters()} changed. */ @UnstableApi int EVENT_PLAYBACK_PARAMETERS_CHANGED = Player.EVENT_PLAYBACK_PARAMETERS_CHANGED; + /** {@link Player#getAvailableCommands()} changed. */ @UnstableApi int EVENT_AVAILABLE_COMMANDS_CHANGED = Player.EVENT_AVAILABLE_COMMANDS_CHANGED; + /** {@link Player#getMediaMetadata()} changed. */ @UnstableApi int EVENT_MEDIA_METADATA_CHANGED = Player.EVENT_MEDIA_METADATA_CHANGED; + /** {@link Player#getPlaylistMetadata()} changed. */ @UnstableApi int EVENT_PLAYLIST_METADATA_CHANGED = Player.EVENT_PLAYLIST_METADATA_CHANGED; + /** {@link Player#getSeekBackIncrement()} changed. */ @UnstableApi int EVENT_SEEK_BACK_INCREMENT_CHANGED = Player.EVENT_SEEK_BACK_INCREMENT_CHANGED; + /** {@link Player#getSeekForwardIncrement()} changed. */ @UnstableApi int EVENT_SEEK_FORWARD_INCREMENT_CHANGED = Player.EVENT_SEEK_FORWARD_INCREMENT_CHANGED; + /** {@link Player#getMaxSeekToPreviousPosition()} changed. */ @UnstableApi int EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED = Player.EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED; + /** {@link Player#getTrackSelectionParameters()} changed. */ @UnstableApi int EVENT_TRACK_SELECTION_PARAMETERS_CHANGED = Player.EVENT_TRACK_SELECTION_PARAMETERS_CHANGED; + /** Audio attributes changed. */ @UnstableApi int EVENT_AUDIO_ATTRIBUTES_CHANGED = Player.EVENT_AUDIO_ATTRIBUTES_CHANGED; + /** An audio session id was set. */ @UnstableApi int EVENT_AUDIO_SESSION_ID = Player.EVENT_AUDIO_SESSION_ID; + /** The volume changed. */ @UnstableApi int EVENT_VOLUME_CHANGED = Player.EVENT_VOLUME_CHANGED; + /** Skipping silences was enabled or disabled in the audio stream. */ @UnstableApi int EVENT_SKIP_SILENCE_ENABLED_CHANGED = Player.EVENT_SKIP_SILENCE_ENABLED_CHANGED; + /** The surface size changed. */ @UnstableApi int EVENT_SURFACE_SIZE_CHANGED = Player.EVENT_SURFACE_SIZE_CHANGED; + /** The video size changed. */ @UnstableApi int EVENT_VIDEO_SIZE_CHANGED = Player.EVENT_VIDEO_SIZE_CHANGED; + /** * The first frame has been rendered since setting the surface, since the renderer was reset or * since the stream changed. */ @UnstableApi int EVENT_RENDERED_FIRST_FRAME = Player.EVENT_RENDERED_FIRST_FRAME; + /** Metadata associated with the current playback time was reported. */ @UnstableApi int EVENT_METADATA = Player.EVENT_METADATA; + /** {@link Player#getCurrentCues()} changed. */ @UnstableApi int EVENT_CUES = Player.EVENT_CUES; + /** {@link Player#getDeviceInfo()} changed. */ @UnstableApi int EVENT_DEVICE_INFO_CHANGED = Player.EVENT_DEVICE_INFO_CHANGED; + /** {@link Player#getDeviceVolume()} changed. */ @UnstableApi int EVENT_DEVICE_VOLUME_CHANGED = Player.EVENT_DEVICE_VOLUME_CHANGED; + /** A source started loading data. */ @UnstableApi int EVENT_LOAD_STARTED = 1000; // Intentional gap to leave space for new Player events + /** A source started completed loading data. */ @UnstableApi int EVENT_LOAD_COMPLETED = 1001; + /** A source canceled loading data. */ @UnstableApi int EVENT_LOAD_CANCELED = 1002; + /** A source had a non-fatal error loading data. */ @UnstableApi int EVENT_LOAD_ERROR = 1003; + /** The downstream format sent to renderers changed. */ @UnstableApi int EVENT_DOWNSTREAM_FORMAT_CHANGED = 1004; + /** Data was removed from the end of the media buffer. */ @UnstableApi int EVENT_UPSTREAM_DISCARDED = 1005; + /** The bandwidth estimate has been updated. */ @UnstableApi int EVENT_BANDWIDTH_ESTIMATE = 1006; + /** An audio renderer was enabled. */ @UnstableApi int EVENT_AUDIO_ENABLED = 1007; + /** An audio renderer created a decoder. */ @UnstableApi int EVENT_AUDIO_DECODER_INITIALIZED = 1008; + /** The format consumed by an audio renderer changed. */ @UnstableApi int EVENT_AUDIO_INPUT_FORMAT_CHANGED = 1009; + /** The audio position has increased for the first time since the last pause or position reset. */ @UnstableApi int EVENT_AUDIO_POSITION_ADVANCING = 1010; + /** An audio underrun occurred. */ @UnstableApi int EVENT_AUDIO_UNDERRUN = 1011; + /** An audio renderer released a decoder. */ @UnstableApi int EVENT_AUDIO_DECODER_RELEASED = 1012; + /** An audio renderer was disabled. */ @UnstableApi int EVENT_AUDIO_DISABLED = 1013; + /** The audio sink encountered a non-fatal error. */ @UnstableApi int EVENT_AUDIO_SINK_ERROR = 1014; + /** A video renderer was enabled. */ @UnstableApi int EVENT_VIDEO_ENABLED = 1015; + /** A video renderer created a decoder. */ @UnstableApi int EVENT_VIDEO_DECODER_INITIALIZED = 1016; + /** The format consumed by a video renderer changed. */ @UnstableApi int EVENT_VIDEO_INPUT_FORMAT_CHANGED = 1017; + /** Video frames have been dropped. */ @UnstableApi int EVENT_DROPPED_VIDEO_FRAMES = 1018; + /** A video renderer released a decoder. */ @UnstableApi int EVENT_VIDEO_DECODER_RELEASED = 1019; + /** A video renderer was disabled. */ @UnstableApi int EVENT_VIDEO_DISABLED = 1020; + /** Video frame processing offset data has been reported. */ @UnstableApi int EVENT_VIDEO_FRAME_PROCESSING_OFFSET = 1021; + /** A DRM session has been acquired. */ @UnstableApi int EVENT_DRM_SESSION_ACQUIRED = 1022; + /** DRM keys were loaded. */ @UnstableApi int EVENT_DRM_KEYS_LOADED = 1023; + /** A non-fatal DRM session manager error occurred. */ @UnstableApi int EVENT_DRM_SESSION_MANAGER_ERROR = 1024; + /** DRM keys were restored. */ @UnstableApi int EVENT_DRM_KEYS_RESTORED = 1025; + /** DRM keys were removed. */ @UnstableApi int EVENT_DRM_KEYS_REMOVED = 1026; + /** A DRM session has been released. */ @UnstableApi int EVENT_DRM_SESSION_RELEASED = 1027; + /** The player was released. */ @UnstableApi int EVENT_PLAYER_RELEASED = 1028; + /** The audio codec encountered an error. */ @UnstableApi int EVENT_AUDIO_CODEC_ERROR = 1029; + /** The video codec encountered an error. */ @UnstableApi int EVENT_VIDEO_CODEC_ERROR = 1030; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/PlaybackStats.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/PlaybackStats.java index 1296db65c8..a8febf125c 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/PlaybackStats.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/PlaybackStats.java @@ -41,6 +41,7 @@ public final class PlaybackStats { public static final class EventTimeAndPlaybackState { /** The event time at which the playback state became active. */ public final EventTime eventTime; + /** The playback state that became active. */ public final @PlaybackState int playbackState; @@ -85,6 +86,7 @@ public final class PlaybackStats { public static final class EventTimeAndFormat { /** The event time associated with {@link #format}. */ public final EventTime eventTime; + /** The format that started being used, or {@code null} if no format was used. */ @Nullable public final Format format; @@ -126,6 +128,7 @@ public final class PlaybackStats { public static final class EventTimeAndException { /** The event time at which the exception occurred. */ public final EventTime eventTime; + /** The exception that was thrown. */ public final Exception exception; @@ -193,36 +196,52 @@ public final class PlaybackStats { PLAYBACK_STATE_ABANDONED }) @interface PlaybackState {} + /** Playback has not started (initial state). */ public static final int PLAYBACK_STATE_NOT_STARTED = 0; + /** Playback is buffering in the background for initial playback start. */ public static final int PLAYBACK_STATE_JOINING_BACKGROUND = 1; + /** Playback is buffering in the foreground for initial playback start. */ public static final int PLAYBACK_STATE_JOINING_FOREGROUND = 2; + /** Playback is actively playing. */ public static final int PLAYBACK_STATE_PLAYING = 3; + /** Playback is paused but ready to play. */ public static final int PLAYBACK_STATE_PAUSED = 4; + /** Playback is handling a seek. */ public static final int PLAYBACK_STATE_SEEKING = 5; + /** Playback is buffering to resume active playback. */ public static final int PLAYBACK_STATE_BUFFERING = 6; + /** Playback is buffering while paused. */ public static final int PLAYBACK_STATE_PAUSED_BUFFERING = 7; + /** Playback is suppressed (e.g. due to audio focus loss). */ public static final int PLAYBACK_STATE_SUPPRESSED = 9; + /** Playback is suppressed (e.g. due to audio focus loss) while buffering to resume a playback. */ public static final int PLAYBACK_STATE_SUPPRESSED_BUFFERING = 10; + /** Playback has reached the end of the media. */ public static final int PLAYBACK_STATE_ENDED = 11; + /** Playback is stopped and can be restarted. */ public static final int PLAYBACK_STATE_STOPPED = 12; + /** Playback is stopped due a fatal error and can be retried. */ public static final int PLAYBACK_STATE_FAILED = 13; + /** Playback is interrupted by an ad. */ public static final int PLAYBACK_STATE_INTERRUPTED_BY_AD = 14; + /** Playback is abandoned before reaching the end of the media. */ public static final int PLAYBACK_STATE_ABANDONED = 15; + /** Total number of playback states. */ /* package */ static final int PLAYBACK_STATE_COUNT = 16; @@ -388,25 +407,32 @@ public final class PlaybackStats { * ordered by {@code EventTime.realTimeMs}. */ public final List playbackStateHistory; + /** * The media time history as an ordered list of long[2] arrays with [0] being the realtime as * returned by {@code SystemClock.elapsedRealtime()} and [1] being the media time at this * realtime, in milliseconds. */ public final List mediaTimeHistory; + /** * The elapsed real-time as returned by {@code SystemClock.elapsedRealtime()} of the first * reported playback event, or {@link C#TIME_UNSET} if no event has been reported. */ public final long firstReportedTimeMs; + /** The number of playbacks which were the active foreground playback at some point. */ public final int foregroundPlaybackCount; + /** The number of playbacks which were abandoned before they were ready to play. */ public final int abandonedBeforeReadyCount; + /** The number of playbacks which reached the ended state at least once. */ public final int endedCount; + /** The number of playbacks which were pre-buffered in the background. */ public final int backgroundJoiningCount; + /** * The total time spent joining the playback, in milliseconds, or {@link C#TIME_UNSET} if no valid * join time could be determined. @@ -416,29 +442,36 @@ public final class PlaybackStats { * joining was interrupted by a seek, stop, or error state. */ public final long totalValidJoinTimeMs; + /** * The number of playbacks with a valid join time as documented in {@link #totalValidJoinTimeMs}. */ public final int validJoinTimeCount; + /** The total number of times a playback has been paused. */ public final int totalPauseCount; + /** The total number of times a playback has been paused while rebuffering. */ public final int totalPauseBufferCount; + /** * The total number of times a seek occurred. This includes seeks happening before playback * resumed after another seek. */ public final int totalSeekCount; + /** * The total number of times a rebuffer occurred. This excludes initial joining and buffering * after seek. */ public final int totalRebufferCount; + /** * The maximum time spent during a single rebuffer, in milliseconds, or {@link C#TIME_UNSET} if no * rebuffer occurred. */ public final long maxRebufferTimeMs; + /** The number of ad playbacks. */ public final int adPlaybackCount; @@ -449,48 +482,61 @@ public final class PlaybackStats { * EventTime.realTimeMs}. The {@link Format} may be null if no video format was used. */ public final List videoFormatHistory; + /** * The audio format history as {@link EventTimeAndFormat EventTimeAndFormats} ordered by {@code * EventTime.realTimeMs}. The {@link Format} may be null if no audio format was used. */ public final List audioFormatHistory; + /** The total media time for which video format height data is available, in milliseconds. */ public final long totalVideoFormatHeightTimeMs; + /** * The accumulated sum of all video format heights, in pixels, times the time the format was used * for playback, in milliseconds. */ public final long totalVideoFormatHeightTimeProduct; + /** The total media time for which video format bitrate data is available, in milliseconds. */ public final long totalVideoFormatBitrateTimeMs; + /** * The accumulated sum of all video format bitrates, in bits per second, times the time the format * was used for playback, in milliseconds. */ public final long totalVideoFormatBitrateTimeProduct; + /** The total media time for which audio format data is available, in milliseconds. */ public final long totalAudioFormatTimeMs; + /** * The accumulated sum of all audio format bitrates, in bits per second, times the time the format * was used for playback, in milliseconds. */ public final long totalAudioFormatBitrateTimeProduct; + /** The number of playbacks with initial video format height data. */ public final int initialVideoFormatHeightCount; + /** The number of playbacks with initial video format bitrate data. */ public final int initialVideoFormatBitrateCount; + /** * The total initial video format height for all playbacks, in pixels, or {@link C#LENGTH_UNSET} * if no initial video format data is available. */ public final int totalInitialVideoFormatHeight; + /** * The total initial video format bitrate for all playbacks, in bits per second, or {@link * C#LENGTH_UNSET} if no initial video format data is available. */ public final long totalInitialVideoFormatBitrate; + /** The number of playbacks with initial audio format bitrate data. */ public final int initialAudioFormatBitrateCount; + /** * The total initial audio format bitrate for all playbacks, in bits per second, or {@link * C#LENGTH_UNSET} if no initial audio format data is available. @@ -501,6 +547,7 @@ public final class PlaybackStats { /** The total time for which bandwidth measurement data is available, in milliseconds. */ public final long totalBandwidthTimeMs; + /** The total bytes transferred during {@link #totalBandwidthTimeMs}. */ public final long totalBandwidthBytes; @@ -508,6 +555,7 @@ public final class PlaybackStats { /** The total number of dropped video frames. */ public final long totalDroppedFrames; + /** The total number of audio underruns. */ public final long totalAudioUnderruns; @@ -518,18 +566,22 @@ public final class PlaybackStats { * stopped due to this error. */ public final int fatalErrorPlaybackCount; + /** The total number of fatal errors. Errors are fatal if playback stopped due to this error. */ public final int fatalErrorCount; + /** * The total number of non-fatal errors. Error are non-fatal if playback can recover from the * error without stopping. */ public final int nonFatalErrorCount; + /** * The history of fatal errors as {@link EventTimeAndException EventTimeAndExceptions} ordered by * {@code EventTime.realTimeMs}. Errors are fatal if playback stopped due to this error. */ public final List fatalErrorHistory; + /** * The history of non-fatal errors as {@link EventTimeAndException EventTimeAndExceptions} ordered * by {@code EventTime.realTimeMs}. Errors are non-fatal if playback can recover from the error diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioOffloadSupport.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioOffloadSupport.java index 5df205778f..91ffc6c8a7 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioOffloadSupport.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioOffloadSupport.java @@ -31,8 +31,10 @@ public final class AudioOffloadSupport { public static final class Builder { /** Whether the format is supported with offload playback. */ private boolean isFormatSupported; + /** Whether playback of the format is supported with gapless transitions. */ private boolean isGaplessSupported; + /** Whether playback of the format is supported with speed changes. */ private boolean isSpeedChangeSupported; @@ -94,8 +96,10 @@ public final class AudioOffloadSupport { /** Whether the format is supported with offload playback. */ public final boolean isFormatSupported; + /** Whether playback of the format is supported with gapless transitions. */ public final boolean isGaplessSupported; + /** Whether playback of the format is supported with speed changes. */ public final boolean isSpeedChangeSupported; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioSink.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioSink.java index 00a441507e..a7cd282cca 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioSink.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioSink.java @@ -163,8 +163,10 @@ public interface AudioSink { /** The underlying {@link AudioTrack}'s state. */ public final int audioTrackState; + /** If the exception can be recovered by recreating the sink. */ public final boolean isRecoverable; + /** The input {@link Format} of the sink when the error occurs. */ public final Format format; @@ -212,8 +214,10 @@ public interface AudioSink { * Otherwise, the meaning of the error code depends on the sink implementation. */ public final int errorCode; + /** If the exception can be recovered by recreating the sink. */ public final boolean isRecoverable; + /** The input {@link Format} of the sink when the error occurs. */ public final Format format; @@ -236,6 +240,7 @@ public interface AudioSink { final class UnexpectedDiscontinuityException extends Exception { /** The actual presentation time of a sample, in microseconds. */ public final long actualPresentationTimeUs; + /** The expected presentation time of a sample, in microseconds. */ public final long expectedPresentationTimeUs; @@ -272,13 +277,16 @@ public interface AudioSink { SINK_FORMAT_UNSUPPORTED }) @interface SinkFormatSupport {} + /** The sink supports the format directly, without the need for internal transcoding. */ int SINK_FORMAT_SUPPORTED_DIRECTLY = 2; + /** * The sink supports the format, but needs to transcode it internally to do so. Internal * transcoding may result in lower quality and higher CPU load in some cases. */ int SINK_FORMAT_SUPPORTED_WITH_TRANSCODING = 1; + /** The sink does not support the format. */ int SINK_FORMAT_UNSUPPORTED = 0; @@ -301,6 +309,7 @@ public interface AudioSink { /** The audio sink will never play in offload mode. */ int OFFLOAD_MODE_DISABLED = 0; + /** * The audio sink will prefer offload playback except in the case where both the track is gapless * and the device does support gapless offload playback. @@ -309,6 +318,7 @@ public interface AudioSink { * savings. */ int OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED = 1; + /** * The audio sink will prefer offload playback even if this might result in silence gaps between * tracks. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioTimestampPoller.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioTimestampPoller.java index 50b2a39feb..374fec488c 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioTimestampPoller.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioTimestampPoller.java @@ -61,23 +61,30 @@ import java.lang.annotation.Target; STATE_ERROR }) private @interface State {} + /** State when first initializing. */ private static final int STATE_INITIALIZING = 0; + /** State when we have a timestamp and we don't know if it's advancing. */ private static final int STATE_TIMESTAMP = 1; + /** State when we have a timestamp and we know it is advancing. */ private static final int STATE_TIMESTAMP_ADVANCING = 2; + /** State when the no timestamp is available. */ private static final int STATE_NO_TIMESTAMP = 3; + /** State when the last timestamp was rejected as invalid. */ private static final int STATE_ERROR = 4; /** The polling interval for {@link #STATE_INITIALIZING} and {@link #STATE_TIMESTAMP}. */ private static final int FAST_POLL_INTERVAL_US = 10_000; + /** * The polling interval for {@link #STATE_TIMESTAMP_ADVANCING} and {@link #STATE_NO_TIMESTAMP}. */ private static final int SLOW_POLL_INTERVAL_US = 10_000_000; + /** The polling interval for {@link #STATE_ERROR}. */ private static final int ERROR_POLL_INTERVAL_US = 500_000; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioTrackPositionTracker.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioTrackPositionTracker.java index 8a9576aeb8..9d85a9e364 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioTrackPositionTracker.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioTrackPositionTracker.java @@ -116,14 +116,17 @@ import java.lang.reflect.Method; @Target(TYPE_USE) @IntDef({PLAYSTATE_STOPPED, PLAYSTATE_PAUSED, PLAYSTATE_PLAYING}) private @interface PlayState {} + /** * @see AudioTrack#PLAYSTATE_STOPPED */ private static final int PLAYSTATE_STOPPED = AudioTrack.PLAYSTATE_STOPPED; + /** * @see AudioTrack#PLAYSTATE_PAUSED */ private static final int PLAYSTATE_PAUSED = AudioTrack.PLAYSTATE_PAUSED; + /** * @see AudioTrack#PLAYSTATE_PLAYING */ @@ -143,6 +146,7 @@ import java.lang.reflect.Method; *

This is a fail safe that should not be required on correctly functioning devices. */ private static final long MAX_LATENCY_US = 5 * C.MICROS_PER_SECOND; + /** The duration of time used to smooth over an adjustment between position sampling modes. */ private static final long MODE_SWITCH_SMOOTHING_DURATION_US = C.MICROS_PER_SECOND; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DecoderAudioRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DecoderAudioRenderer.java index 202ba408d4..812780c537 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DecoderAudioRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DecoderAudioRenderer.java @@ -110,20 +110,24 @@ public abstract class DecoderAudioRenderer< REINITIALIZATION_STATE_WAIT_END_OF_STREAM }) private @interface ReinitializationState {} + /** The decoder does not need to be re-initialized. */ private static final int REINITIALIZATION_STATE_NONE = 0; + /** * The input format has changed in a way that requires the decoder to be re-initialized, but we * haven't yet signaled an end of stream to the existing decoder. We need to do so in order to * ensure that it outputs any remaining buffers before we release it. */ private static final int REINITIALIZATION_STATE_SIGNAL_END_OF_STREAM = 1; + /** * The input format has changed in a way that requires the decoder to be re-initialized, and we've * signaled an end of stream to the existing decoder. We're waiting for the decoder to output an * end of stream signal to indicate that it has output any remaining buffers before we release it. */ private static final int REINITIALIZATION_STATE_WAIT_END_OF_STREAM = 2; + /** * Generally there is zero or one pending output stream offset. We track more offsets to allow for * pending output streams that have fewer frames than the codec latency. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java index 82cb742ec1..b226323093 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java @@ -194,6 +194,7 @@ public final class DefaultAudioSink implements AudioSink { /** Default instance. */ AudioTrackBufferSizeProvider DEFAULT = new DefaultAudioTrackBufferSizeProvider.Builder().build(); + /** * Returns the buffer size to use when creating an {@link AudioTrack} for a specific format and * output mode. @@ -404,12 +405,16 @@ public final class DefaultAudioSink implements AudioSink { /** The default playback speed. */ public static final float DEFAULT_PLAYBACK_SPEED = 1f; + /** The minimum allowed playback speed. Lower values will be constrained to fall in range. */ public static final float MIN_PLAYBACK_SPEED = 0.1f; + /** The maximum allowed playback speed. Higher values will be constrained to fall in range. */ public static final float MAX_PLAYBACK_SPEED = 8f; + /** The minimum allowed pitch factor. Lower values will be constrained to fall in range. */ public static final float MIN_PITCH = 0.1f; + /** The maximum allowed pitch factor. Higher values will be constrained to fall in range. */ public static final float MAX_PITCH = 8f; @@ -425,8 +430,10 @@ public final class DefaultAudioSink implements AudioSink { /** The audio sink plays PCM audio. */ public static final int OUTPUT_MODE_PCM = 0; + /** The audio sink plays encoded audio in offload. */ public static final int OUTPUT_MODE_OFFLOAD = 1; + /** The audio sink plays encoded audio in passthrough. */ public static final int OUTPUT_MODE_PASSTHROUGH = 2; @@ -1874,8 +1881,10 @@ public final class DefaultAudioSink implements AudioSink { /** The playback parameters. */ public final PlaybackParameters playbackParameters; + /** The media time from which the playback parameters apply, in microseconds. */ public final long mediaTimeUs; + /** The audio track position from which the playback parameters apply, in microseconds. */ public final long audioTrackPositionUs; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioTrackBufferSizeProvider.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioTrackBufferSizeProvider.java index e0f117d222..9819ab0380 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioTrackBufferSizeProvider.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioTrackBufferSizeProvider.java @@ -44,14 +44,19 @@ public class DefaultAudioTrackBufferSizeProvider /** Default minimum length for the {@link AudioTrack} buffer, in microseconds. */ private static final int MIN_PCM_BUFFER_DURATION_US = 250_000; + /** Default maximum length for the {@link AudioTrack} buffer, in microseconds. */ private static final int MAX_PCM_BUFFER_DURATION_US = 750_000; + /** Default multiplication factor to apply to the minimum buffer size requested. */ private static final int PCM_BUFFER_MULTIPLICATION_FACTOR = 4; + /** Default length for passthrough {@link AudioTrack} buffers, in microseconds. */ private static final int PASSTHROUGH_BUFFER_DURATION_US = 250_000; + /** Default length for offload {@link AudioTrack} buffers, in microseconds. */ private static final int OFFLOAD_BUFFER_DURATION_US = 50_000_000; + /** * Default multiplication factor to apply to AC3 passthrough buffer to avoid underruns on some * devices (e.g., Broadcom 7271). @@ -146,14 +151,19 @@ public class DefaultAudioTrackBufferSizeProvider /** The minimum length for PCM {@link AudioTrack} buffers, in microseconds. */ protected final int minPcmBufferDurationUs; + /** The maximum length for PCM {@link AudioTrack} buffers, in microseconds. */ protected final int maxPcmBufferDurationUs; + /** The multiplication factor to apply to the minimum buffer size requested. */ protected final int pcmBufferMultiplicationFactor; + /** The length for passthrough {@link AudioTrack} buffers, in microseconds. */ protected final int passthroughBufferDurationUs; + /** The length for offload {@link AudioTrack} buffers, in microseconds. */ protected final int offloadBufferDurationUs; + /** * The multiplication factor to apply to AC3 passthrough buffer to avoid underruns on some devices * (e.g., Broadcom 7271). diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/MediaCodecAudioRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/MediaCodecAudioRenderer.java index 12a9835f14..e98889ecf6 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/MediaCodecAudioRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/MediaCodecAudioRenderer.java @@ -93,6 +93,7 @@ import java.util.List; public class MediaCodecAudioRenderer extends MediaCodecRenderer implements MediaClock { private static final String TAG = "MediaCodecAudioRenderer"; + /** * Custom key used to indicate bits per sample by some decoders on Vivo devices. For example * OMX.vivo.alac.decoder on the Vivo Z1 Pro. @@ -106,6 +107,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media private int codecMaxInputSize; private boolean codecNeedsDiscardChannelsWorkaround; @Nullable private Format inputFormat; + /** Codec used for DRM decryption only in passthrough and offload. */ @Nullable private Format decryptOnlyCodecFormat; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/SilenceSkippingAudioProcessor.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/SilenceSkippingAudioProcessor.java index 84700fe658..53898a9747 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/SilenceSkippingAudioProcessor.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/SilenceSkippingAudioProcessor.java @@ -44,11 +44,13 @@ public final class SilenceSkippingAudioProcessor extends BaseAudioProcessor { * minimumSilenceDurationUs}. */ public static final long DEFAULT_MINIMUM_SILENCE_DURATION_US = 150_000; + /** * The default value for {@link #SilenceSkippingAudioProcessor(long, long, short) * paddingSilenceUs}. */ public static final long DEFAULT_PADDING_SILENCE_US = 20_000; + /** * The default value for {@link #SilenceSkippingAudioProcessor(long, long, short) * silenceThresholdLevel}. @@ -65,10 +67,13 @@ public final class SilenceSkippingAudioProcessor extends BaseAudioProcessor { STATE_SILENT, }) private @interface State {} + /** State when the input is not silent. */ private static final int STATE_NOISY = 0; + /** State when the input may be silent but we haven't read enough yet to know. */ private static final int STATE_MAYBE_SILENT = 1; + /** State when the input is silent. */ private static final int STATE_SILENT = 2; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManager.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManager.java index 4fd04f9c57..5067c57319 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManager.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManager.java @@ -276,19 +276,25 @@ public class DefaultDrmSessionManager implements DrmSessionManager { @Target(TYPE_USE) @IntDef({MODE_PLAYBACK, MODE_QUERY, MODE_DOWNLOAD, MODE_RELEASE}) public @interface Mode {} + /** * Loads and refreshes (if necessary) a license for playback. Supports streaming and offline * licenses. */ public static final int MODE_PLAYBACK = 0; + /** Restores an offline license to allow its status to be queried. */ public static final int MODE_QUERY = 1; + /** Downloads an offline license or renews an existing one. */ public static final int MODE_DOWNLOAD = 2; + /** Releases an existing offline license. */ public static final int MODE_RELEASE = 3; + /** Number of times to retry for initial provisioning and key request for reporting error. */ public static final int INITIAL_DRM_REQUEST_RETRY_COUNT = 3; + /** Default value for {@link Builder#setSessionKeepaliveMs(long)}. */ public static final long DEFAULT_SESSION_KEEPALIVE_MS = 5 * 60 * C.MILLIS_PER_SECOND; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmSession.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmSession.java index 968a3d207f..c6283aa429 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmSession.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmSession.java @@ -84,17 +84,22 @@ public interface DrmSession { @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({STATE_RELEASED, STATE_ERROR, STATE_OPENING, STATE_OPENED, STATE_OPENED_WITH_KEYS}) @interface State {} + /** The session has been released. This is a terminal state. */ int STATE_RELEASED = 0; + /** * The session has encountered an error. {@link #getError()} can be used to retrieve the cause. * This is a terminal state. */ int STATE_ERROR = 1; + /** The session is being opened. */ int STATE_OPENING = 2; + /** The session is open, but does not have keys required for decryption. */ int STATE_OPENED = 3; + /** The session is open and has keys required for decryption. */ int STATE_OPENED_WITH_KEYS = 4; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmSessionEventListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmSessionEventListener.java index 414c4ae58d..72a7f7cf35 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmSessionEventListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmSessionEventListener.java @@ -100,6 +100,7 @@ public interface DrmSessionEventListener { /** The timeline window index reported with the events. */ public final int windowIndex; + /** The {@link MediaPeriodId} reported with the events. */ @Nullable public final MediaPeriodId mediaPeriodId; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmUtil.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmUtil.java index a47fb682bb..f9101ae08a 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmUtil.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmUtil.java @@ -57,8 +57,10 @@ public final class DrmUtil { /** Corresponds to failures caused by an {@link ExoMediaDrm} method call. */ public static final int ERROR_SOURCE_EXO_MEDIA_DRM = 1; + /** Corresponds to failures caused by an operation related to obtaining DRM licenses. */ public static final int ERROR_SOURCE_LICENSE_ACQUISITION = 2; + /** Corresponds to failures caused by an operation related to provisioning the device. */ public static final int ERROR_SOURCE_PROVISIONING = 3; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/ExoMediaDrm.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/ExoMediaDrm.java index 115cad12bb..9bd4205a7d 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/ExoMediaDrm.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/ExoMediaDrm.java @@ -97,10 +97,12 @@ public interface ExoMediaDrm { @UnstableApi @SuppressWarnings("InlinedApi") int EVENT_KEY_REQUIRED = MediaDrm.EVENT_KEY_REQUIRED; + /** Event indicating that keys have expired, and are no longer usable. */ @UnstableApi @SuppressWarnings("InlinedApi") int EVENT_KEY_EXPIRED = MediaDrm.EVENT_KEY_EXPIRED; + /** Event indicating that a certificate needs to be requested from the provisioning server. */ @UnstableApi @SuppressWarnings("InlinedApi") @@ -113,6 +115,7 @@ public interface ExoMediaDrm { @UnstableApi @SuppressWarnings("InlinedApi") int KEY_TYPE_STREAMING = MediaDrm.KEY_TYPE_STREAMING; + /** * Key request type for keys that will be used for offline use. They will be saved to the device * for subsequent use when the device is not connected to a network. @@ -120,6 +123,7 @@ public interface ExoMediaDrm { @UnstableApi @SuppressWarnings("InlinedApi") int KEY_TYPE_OFFLINE = MediaDrm.KEY_TYPE_OFFLINE; + /** Key request type indicating that saved offline keys should be released. */ @UnstableApi @SuppressWarnings("InlinedApi") @@ -256,15 +260,19 @@ public interface ExoMediaDrm { /** Key request type for an initial license request. */ public static final int REQUEST_TYPE_INITIAL = MediaDrm.KeyRequest.REQUEST_TYPE_INITIAL; + /** Key request type for license renewal. */ public static final int REQUEST_TYPE_RENEWAL = MediaDrm.KeyRequest.REQUEST_TYPE_RENEWAL; + /** Key request type for license release. */ public static final int REQUEST_TYPE_RELEASE = MediaDrm.KeyRequest.REQUEST_TYPE_RELEASE; + /** * Key request type if keys are already loaded and available for use. No license request is * necessary, and no key request data is returned. */ public static final int REQUEST_TYPE_NONE = MediaDrm.KeyRequest.REQUEST_TYPE_NONE; + /** * Key request type if keys have been loaded, but an additional license request is needed to * update their values. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/FrameworkCryptoConfig.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/FrameworkCryptoConfig.java index c0ad39cc9c..ee66d07b0a 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/FrameworkCryptoConfig.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/FrameworkCryptoConfig.java @@ -42,8 +42,10 @@ public final class FrameworkCryptoConfig implements CryptoConfig { /** The DRM scheme UUID. */ public final UUID uuid; + /** The DRM session id. */ public final byte[] sessionId; + /** * Whether to allow use of insecure decoder components even if the underlying platform says * otherwise. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/MediaDrmCallbackException.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/MediaDrmCallbackException.java index 0cf5abebd3..7ef362589f 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/MediaDrmCallbackException.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/MediaDrmCallbackException.java @@ -31,13 +31,16 @@ public final class MediaDrmCallbackException extends IOException { /** The {@link DataSpec} associated with the request. */ public final DataSpec dataSpec; + /** * The {@link Uri} after redirections, or {@link #dataSpec dataSpec.uri} if no redirection * occurred. */ public final Uri uriAfterRedirects; + /** The HTTP request headers included in the response. */ public final Map> responseHeaders; + /** The number of bytes obtained from the server. */ public final long bytesLoaded; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/UnsupportedDrmException.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/UnsupportedDrmException.java index 2b70a51439..8711ab131d 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/UnsupportedDrmException.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/UnsupportedDrmException.java @@ -43,8 +43,10 @@ public final class UnsupportedDrmException extends Exception { @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({REASON_UNSUPPORTED_SCHEME, REASON_INSTANTIATION_ERROR}) public @interface Reason {} + /** The requested DRM scheme is unsupported by the device. */ public static final int REASON_UNSUPPORTED_SCHEME = 1; + /** * There device advertises support for the requested DRM scheme, but there was an error * instantiating it. The cause can be retrieved using {@link #getCause()}. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/WidevineUtil.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/WidevineUtil.java index 2815f8c796..1063b896ac 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/WidevineUtil.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/WidevineUtil.java @@ -27,6 +27,7 @@ public final class WidevineUtil { /** Widevine specific key status field name for the remaining license duration, in seconds. */ public static final String PROPERTY_LICENSE_DURATION_REMAINING = "LicenseDurationRemaining"; + /** Widevine specific key status field name for the remaining playback duration, in seconds. */ public static final String PROPERTY_PLAYBACK_DURATION_REMAINING = "PlaybackDurationRemaining"; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/BatchBuffer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/BatchBuffer.java index b222dfe619..4b41709d3b 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/BatchBuffer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/BatchBuffer.java @@ -29,6 +29,7 @@ import java.nio.ByteBuffer; /** The default maximum number of samples that can be appended before the buffer is full. */ public static final int DEFAULT_MAX_SAMPLE_COUNT = 32; + /** * The maximum size of the buffer in bytes. This prevents excessive memory usage for high bitrate * streams. The limit is equivalent of 75s of mp3 at highest bitrate (320kb/s) and 30s of AAC LC diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecAdapter.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecAdapter.java index 6fa902bd7a..49c9620f0f 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecAdapter.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecAdapter.java @@ -81,18 +81,23 @@ public interface MediaCodecAdapter { /** Information about the {@link MediaCodec} being configured. */ public final MediaCodecInfo codecInfo; + /** The {@link MediaFormat} for which the codec is being configured. */ public final MediaFormat mediaFormat; + /** The {@link Format} for which the codec is being configured. */ public final Format format; + /** * For video decoding, the output where the object will render the decoded frames. This must be * null if the codec is not a video decoder, or if it is configured for {@link ByteBuffer} * output. */ @Nullable public final Surface surface; + /** For DRM protected playbacks, a {@link MediaCrypto} to use for decryption. */ @Nullable public final MediaCrypto crypto; + /** See {@link MediaCodec#configure}. */ public final int flags; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecInfo.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecInfo.java index 8bc7d67ff4..9591aea2db 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecInfo.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecInfo.java @@ -896,11 +896,13 @@ public final class MediaCodecInfo { /** The decoder has a PerformancePoint that covers the resolution and frame rate */ private static final int COVERAGE_RESULT_YES = 2; + /** * The decoder has at least one PerformancePoint, but none of them cover the resolution and frame * rate */ private static final int COVERAGE_RESULT_NO = 1; + /** The VideoCapabilities does not contain any PerformancePoints */ private static final int COVERAGE_RESULT_NO_EMPTY_LIST = 0; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java index 387ac41d92..b5cc99b504 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java @@ -218,10 +218,13 @@ public abstract class MediaCodecRenderer extends BaseRenderer { RECONFIGURATION_STATE_QUEUE_PENDING }) private @interface ReconfigurationState {} + /** There is no pending adaptive reconfiguration work. */ private static final int RECONFIGURATION_STATE_NONE = 0; + /** Codec configuration data needs to be written into the next buffer. */ private static final int RECONFIGURATION_STATE_WRITE_PENDING = 1; + /** * Codec configuration data has been written into the next buffer, but that buffer still needs to * be returned to the codec. @@ -233,10 +236,13 @@ public abstract class MediaCodecRenderer extends BaseRenderer { @Target(TYPE_USE) @IntDef({DRAIN_STATE_NONE, DRAIN_STATE_SIGNAL_END_OF_STREAM, DRAIN_STATE_WAIT_END_OF_STREAM}) private @interface DrainState {} + /** The codec is not being drained. */ private static final int DRAIN_STATE_NONE = 0; + /** The codec needs to be drained, but we haven't signaled an end of stream to it yet. */ private static final int DRAIN_STATE_SIGNAL_END_OF_STREAM = 1; + /** The codec needs to be drained, and we're waiting for it to output an end of stream. */ private static final int DRAIN_STATE_WAIT_END_OF_STREAM = 2; @@ -250,12 +256,16 @@ public abstract class MediaCodecRenderer extends BaseRenderer { DRAIN_ACTION_REINITIALIZE }) private @interface DrainAction {} + /** No special action should be taken. */ private static final int DRAIN_ACTION_NONE = 0; + /** The codec should be flushed. */ private static final int DRAIN_ACTION_FLUSH = 1; + /** The codec should be flushed and updated to use the pending DRM session. */ private static final int DRAIN_ACTION_FLUSH_AND_UPDATE_DRM_SESSION = 2; + /** The codec should be reinitialized. */ private static final int DRAIN_ACTION_REINITIALIZE = 3; @@ -271,10 +281,12 @@ public abstract class MediaCodecRenderer extends BaseRenderer { /** The adaptation workaround is never used. */ private static final int ADAPTATION_WORKAROUND_MODE_NEVER = 0; + /** * The adaptation workaround is used when adapting between formats of the same resolution only. */ private static final int ADAPTATION_WORKAROUND_MODE_SAME_RESOLUTION = 1; + /** The adaptation workaround is always used when adapting between formats. */ private static final int ADAPTATION_WORKAROUND_MODE_ALWAYS = 2; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/Download.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/Download.java index 6eae3298d3..1674bd4779 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/Download.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/Download.java @@ -54,6 +54,7 @@ public final class Download { STATE_RESTARTING }) public @interface State {} + // Important: These constants are persisted into DownloadIndex. Do not change them. /** * The download is waiting to be started. A download may be queued because the {@code @@ -67,16 +68,22 @@ public final class Download { * */ public static final int STATE_QUEUED = 0; + /** The download is stopped for a specified {@link #stopReason}. */ public static final int STATE_STOPPED = 1; + /** The download is currently started. */ public static final int STATE_DOWNLOADING = 2; + /** The download completed. */ public static final int STATE_COMPLETED = 3; + /** The download failed. */ public static final int STATE_FAILED = 4; + /** The download is being removed. */ public static final int STATE_REMOVING = 5; + /** The download will restart after all downloaded data is removed. */ public static final int STATE_RESTARTING = 7; @@ -88,8 +95,10 @@ public final class Download { @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({FAILURE_REASON_NONE, FAILURE_REASON_UNKNOWN}) public @interface FailureReason {} + /** The download isn't failed. */ public static final int FAILURE_REASON_NONE = 0; + /** The download is failed because of unknown reason. */ public static final int FAILURE_REASON_UNKNOWN = 1; @@ -98,16 +107,22 @@ public final class Download { /** The download request. */ public final DownloadRequest request; + /** The state of the download. */ public final @State int state; + /** The first time when download entry is created. */ public final long startTimeMs; + /** The last update time. */ public final long updateTimeMs; + /** The total size of the content in bytes, or {@link C#LENGTH_UNSET} if unknown. */ public final long contentLength; + /** The reason the download is stopped, or {@link #STOP_REASON_NONE}. */ public final int stopReason; + /** * If {@link #state} is {@link #STATE_FAILED} then this is the cause, otherwise {@link * #FAILURE_REASON_NONE}. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadManager.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadManager.java index 2284b936fa..40c133c0a7 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadManager.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadManager.java @@ -148,8 +148,10 @@ public final class DownloadManager { /** The default maximum number of parallel downloads. */ public static final int DEFAULT_MAX_PARALLEL_DOWNLOADS = 3; + /** The default minimum number of times a download must be retried before failing. */ public static final int DEFAULT_MIN_RETRY_COUNT = 5; + /** The default requirement is that the device has network connectivity. */ public static final Requirements DEFAULT_REQUIREMENTS = new Requirements(Requirements.NETWORK); diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadRequest.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadRequest.java index 487b998d0a..2f69102775 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadRequest.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadRequest.java @@ -107,23 +107,29 @@ public final class DownloadRequest implements Parcelable { /** The unique content id. */ public final String id; + /** The uri being downloaded. */ public final Uri uri; + /** * The MIME type of this content. Used as a hint to infer the content's type (DASH, HLS, * SmoothStreaming). If null, a {@code DownloadService} will infer the content type from the * {@link #uri}. */ @Nullable public final String mimeType; + /** Stream keys to be downloaded. If empty, all streams will be downloaded. */ public final List streamKeys; + /** The key set id of the offline licence if the content is protected with DRM. */ @Nullable public final byte[] keySetId; + /** * Custom key for cache indexing, or null. Must be null for DASH, HLS and SmoothStreaming * downloads. */ @Nullable public final String customCacheKey; + /** Application defined data associated with the download. May be empty. */ public final byte[] data; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/scheduler/Requirements.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/scheduler/Requirements.java index 53ad113710..cd503ba09f 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/scheduler/Requirements.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/scheduler/Requirements.java @@ -62,12 +62,16 @@ public final class Requirements implements Parcelable { /** Requirement that the device has network connectivity. */ public static final int NETWORK = 1; + /** Requirement that the device has a network connection that is unmetered. */ public static final int NETWORK_UNMETERED = 1 << 1; + /** Requirement that the device is idle. */ public static final int DEVICE_IDLE = 1 << 2; + /** Requirement that the device is charging. */ public static final int DEVICE_CHARGING = 1 << 3; + /** * Requirement that the device's internal storage is not low. Note that this requirement * is not affected by the status of external storage. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ClippingMediaSource.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ClippingMediaSource.java index f11d117f72..8576fd2fdd 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ClippingMediaSource.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ClippingMediaSource.java @@ -53,10 +53,13 @@ public final class ClippingMediaSource extends WrappingMediaSource { @Target(TYPE_USE) @IntDef({REASON_INVALID_PERIOD_COUNT, REASON_NOT_SEEKABLE_TO_START, REASON_START_EXCEEDS_END}) public @interface Reason {} + /** The wrapped source doesn't consist of a single period. */ public static final int REASON_INVALID_PERIOD_COUNT = 0; + /** The wrapped source is not seekable and a non-zero clipping start position was specified. */ public static final int REASON_NOT_SEEKABLE_TO_START = 1; + /** The wrapped source ends before the specified clipping start position. */ public static final int REASON_START_EXCEEDS_END = 2; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/LoadEventInfo.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/LoadEventInfo.java index fa9c7e7f56..cf2ca7635f 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/LoadEventInfo.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/LoadEventInfo.java @@ -38,20 +38,26 @@ public final class LoadEventInfo { /** Identifies the load task to which this event corresponds. */ public final long loadTaskId; + /** Defines the requested data. */ public final DataSpec dataSpec; + /** * The {@link Uri} from which data is being read. The uri will be identical to the one in {@link * #dataSpec}.uri unless redirection has occurred. If redirection has occurred, this is the uri * after redirection. */ public final Uri uri; + /** The response headers associated with the load, or an empty map if unavailable. */ public final Map> responseHeaders; + /** The value of {@link SystemClock#elapsedRealtime} at the time of the load event. */ public final long elapsedRealtimeMs; + /** The duration of the load up to the event time. */ public final long loadDurationMs; + /** The number of bytes that were loaded up to the event time. */ public final long bytesLoaded; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaLoadData.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaLoadData.java index c5df2e15ea..63ba909e3d 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaLoadData.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaLoadData.java @@ -29,31 +29,37 @@ public final class MediaLoadData { /** The {@link DataType data type}. */ public final @DataType int dataType; + /** * One of the {@link TrackType track types}, which is a media track type if the data corresponds * to media of a specific type, or {@link C#TRACK_TYPE_UNKNOWN} otherwise. */ public final @TrackType int trackType; + /** * The format of the track to which the data belongs. Null if the data does not belong to a * specific track. */ @Nullable public final Format trackFormat; + /** * One of the {@link SelectionReason selection reasons} if the data belongs to a track. {@link * C#SELECTION_REASON_UNKNOWN} otherwise. */ public final @C.SelectionReason int trackSelectionReason; + /** * Optional data associated with the selection of the track to which the data belongs. Null if the * data does not belong to a track. */ @Nullable public final Object trackSelectionData; + /** * The start time of the media in the {@link MediaPeriod}, or {@link C#TIME_UNSET} if the data * does not belong to a specific {@link MediaPeriod}. */ public final long mediaStartTimeMs; + /** * The end time of the media in the {@link MediaPeriod}, or {@link C#TIME_UNSET} if the data does * not belong to a specific {@link MediaPeriod} or the end time is unknown. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java index 5cb2ea15b1..4583dc9991 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java @@ -148,6 +148,7 @@ public interface MediaSourceEventListener { /** The timeline window index reported with the events. */ public final int windowIndex; + /** The {@link MediaPeriodId} reported with the events. */ @Nullable public final MediaPeriodId mediaPeriodId; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaSource.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaSource.java index fc708ba175..b7cc41f04a 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaSource.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaSource.java @@ -57,6 +57,7 @@ public final class MergingMediaSource extends CompositeMediaSource { @Target(TYPE_USE) @IntDef({REASON_PERIOD_COUNT_MISMATCH}) public @interface Reason {} + /** The sources have different period counts. */ public static final int REASON_PERIOD_COUNT_MISMATCH = 0; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleDataQueue.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleDataQueue.java index bd6c2a5601..3643036429 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleDataQueue.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleDataQueue.java @@ -463,12 +463,15 @@ import java.util.Arrays; /** The absolute position of the start of the data (inclusive). */ public long startPosition; + /** The absolute position of the end of the data (exclusive). */ public long endPosition; + /** * The {@link Allocation}, or {@code null} if the node is not {@link #initialize initialized}. */ @Nullable public Allocation allocation; + /** * The next {@link AllocationNode} in the list, or {@code null} if the node is not {@link * #initialize initialized}. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleStream.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleStream.java index dc088cd117..146cddc9f8 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleStream.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleStream.java @@ -44,8 +44,10 @@ public interface SampleStream { flag = true, value = {FLAG_PEEK, FLAG_REQUIRE_FORMAT, FLAG_OMIT_SAMPLE_DATA}) @interface ReadFlags {} + /** Specifies that the read position should not be advanced if a sample buffer is read. */ int FLAG_PEEK = 1; + /** * Specifies that if a sample buffer would normally be read next, the format of the stream should * be read instead. In detail, the effect of this flag is as follows: @@ -60,6 +62,7 @@ public interface SampleStream { * */ int FLAG_REQUIRE_FORMAT = 1 << 1; + /** * Specifies that {@link DecoderInputBuffer#data}, {@link DecoderInputBuffer#supplementalData} and * {@link DecoderInputBuffer#cryptoInfo} should not be populated when reading a sample buffer. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/AdsMediaSource.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/AdsMediaSource.java index 0263361a12..5015b9f67f 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/AdsMediaSource.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/AdsMediaSource.java @@ -79,12 +79,16 @@ public final class AdsMediaSource extends CompositeMediaSource { @Target(TYPE_USE) @IntDef({TYPE_AD, TYPE_AD_GROUP, TYPE_ALL_ADS, TYPE_UNEXPECTED}) public @interface Type {} + /** Type for when an ad failed to load. The ad will be skipped. */ public static final int TYPE_AD = 0; + /** Type for when an ad group failed to load. The ad group will be skipped. */ public static final int TYPE_AD_GROUP = 1; + /** Type for when all ad groups failed to load. All ads will be skipped. */ public static final int TYPE_ALL_ADS = 2; + /** Type for when an unexpected error occurred while loading ads. All ads will be skipped. */ public static final int TYPE_UNEXPECTED = 3; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/BaseMediaChunk.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/BaseMediaChunk.java index 77da67fe38..46f0ce1542 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/BaseMediaChunk.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/BaseMediaChunk.java @@ -33,6 +33,7 @@ public abstract class BaseMediaChunk extends MediaChunk { * start of the chunk. */ public final long clippedStartTimeUs; + /** * The time from which output will end, or {@link C#TIME_UNSET} if output will end at the end of * the chunk. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/Chunk.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/Chunk.java index 7a2d8060ec..ea00cf5eab 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/Chunk.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/Chunk.java @@ -39,28 +39,35 @@ public abstract class Chunk implements Loadable { /** Identifies the load task for this loadable. */ public final long loadTaskId; + /** The {@link DataSpec} that defines the data to be loaded. */ public final DataSpec dataSpec; + /** The {@link DataType data type} of the chunk. For reporting only. */ public final @DataType int type; + /** The format of the track to which this chunk belongs. */ public final Format trackFormat; + /** * One of the {@link C.SelectionReason selection reasons} if the chunk belongs to a track. {@link * C#SELECTION_REASON_UNKNOWN} if the chunk does not belong to a track, or if the selection reason * is unknown. */ public final @C.SelectionReason int trackSelectionReason; + /** * Optional data associated with the selection of the track to which this chunk belongs. Null if * the chunk does not belong to a track, or if there is no associated track selection data. */ @Nullable public final Object trackSelectionData; + /** * The start time of the media contained by the chunk, or {@link C#TIME_UNSET} if the data being * loaded does not contain media samples. */ public final long startTimeUs; + /** * The end time of the media contained by the chunk, or {@link C#TIME_UNSET} if the data being * loaded does not contain media samples. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/TextRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/TextRenderer.java index 8cd8bb0c37..de74671018 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/TextRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/TextRenderer.java @@ -71,14 +71,17 @@ public final class TextRenderer extends BaseRenderer implements Callback { REPLACEMENT_STATE_WAIT_END_OF_STREAM }) private @interface ReplacementState {} + /** The decoder does not need to be replaced. */ private static final int REPLACEMENT_STATE_NONE = 0; + /** * The decoder needs to be replaced, but we haven't yet signaled an end of stream to the existing * decoder. We need to do so in order to ensure that it outputs any remaining buffers before we * release it. */ private static final int REPLACEMENT_STATE_SIGNAL_END_OF_STREAM = 1; + /** * The decoder needs to be replaced, and we've signaled an end of stream to the existing decoder. * We're waiting for the decoder to output an end of stream signal to indicate that it has output diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/AdaptiveTrackSelection.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/AdaptiveTrackSelection.java index ee1afd5505..51fd488033 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/AdaptiveTrackSelection.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/AdaptiveTrackSelection.java @@ -826,6 +826,7 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { /** Total bandwidth in bits per second at which this checkpoint applies. */ public final long totalBandwidth; + /** Allocated bandwidth at this checkpoint in bits per second. */ public final long allocatedBandwidth; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/BaseTrackSelection.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/BaseTrackSelection.java index 73cf7b9daf..77e4a752b7 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/BaseTrackSelection.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/BaseTrackSelection.java @@ -35,15 +35,19 @@ public abstract class BaseTrackSelection implements ExoTrackSelection { /** The selected {@link TrackGroup}. */ protected final TrackGroup group; + /** The number of selected tracks within the {@link TrackGroup}. Always greater than zero. */ protected final int length; + /** The indices of the selected tracks in {@link #group}, in order of decreasing bandwidth. */ protected final int[] tracks; /** The type of the selection. */ private final @Type int type; + /** The {@link Format}s of the selected tracks, in order of decreasing bandwidth. */ private final Format[] formats; + /** Selected track exclusion timestamps, in order of decreasing bandwidth. */ private final long[] excludeUntilTimes; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java index af67f3b346..7d3ff55245 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java @@ -1663,6 +1663,7 @@ public class DefaultTrackSelector extends MappingTrackSelector */ @SuppressWarnings("deprecation") public static final Parameters DEFAULT_WITHOUT_CONTEXT = new Builder().build(); + /** * @deprecated This instance is not configured using {@link Context} constraints. Use {@link * #getDefaults(Context)} instead. @@ -1682,6 +1683,7 @@ public class DefaultTrackSelector extends MappingTrackSelector * {@code true}. */ public final boolean exceedVideoConstraintsIfNecessary; + /** * Whether to allow adaptive video selections containing mixed MIME types. Adaptations between * different MIME types may not be completely seamless, in which case {@link @@ -1689,11 +1691,13 @@ public class DefaultTrackSelector extends MappingTrackSelector * selections to be made. The default value is {@code false}. */ public final boolean allowVideoMixedMimeTypeAdaptiveness; + /** * Whether to allow adaptive video selections where adaptation may not be completely seamless. * The default value is {@code true}. */ public final boolean allowVideoNonSeamlessAdaptiveness; + /** * Whether to allow adaptive video selections with mixed levels of {@link * RendererCapabilities.DecoderSupport} and {@link @@ -1708,28 +1712,33 @@ public class DefaultTrackSelector extends MappingTrackSelector * when no selection can be made otherwise. The default value is {@code true}. */ public final boolean exceedAudioConstraintsIfNecessary; + /** * Whether to allow adaptive audio selections containing mixed MIME types. Adaptations between * different MIME types may not be completely seamless. The default value is {@code false}. */ public final boolean allowAudioMixedMimeTypeAdaptiveness; + /** * Whether to allow adaptive audio selections containing mixed sample rates. Adaptations between * different sample rates may not be completely seamless. The default value is {@code false}. */ public final boolean allowAudioMixedSampleRateAdaptiveness; + /** * Whether to allow adaptive audio selections containing mixed channel counts. Adaptations * between different channel counts may not be completely seamless. The default value is {@code * false}. */ public final boolean allowAudioMixedChannelCountAdaptiveness; + /** * Whether to allow adaptive audio selections with mixed levels of {@link * RendererCapabilities.DecoderSupport} and {@link * RendererCapabilities.HardwareAccelerationSupport}. */ public final boolean allowAudioMixedDecoderSupportAdaptiveness; + /** * Whether to constrain audio track selection so that the selected track's channel count does * not exceed the device's output capabilities. The default value is {@code true}. @@ -1748,8 +1757,10 @@ public class DefaultTrackSelector extends MappingTrackSelector * {@code true}. */ public final boolean exceedRendererCapabilitiesIfNecessary; + /** Whether to enable tunneling if possible. */ public final boolean tunnelingEnabled; + /** * Whether multiple adaptive selections with more than one track are allowed. The default value * is {@code true}. @@ -2202,8 +2213,10 @@ public class DefaultTrackSelector extends MappingTrackSelector /** Track is not eligible for selection. */ protected static final int SELECTION_ELIGIBILITY_NO = 0; + /** Track is eligible for a fixed selection with one track. */ protected static final int SELECTION_ELIGIBILITY_FIXED = 1; + /** * Track is eligible for both a fixed selection and as part of an adaptive selection with multiple * tracks. @@ -2224,6 +2237,7 @@ public class DefaultTrackSelector extends MappingTrackSelector first == Format.NO_VALUE ? (second == Format.NO_VALUE ? 0 : -1) : (second == Format.NO_VALUE ? 1 : (first - second))); + /** Ordering where all elements are equal. */ private static final Ordering NO_ORDER = Ordering.from((first, second) -> 0); diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/ExoTrackSelection.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/ExoTrackSelection.java index 92c11d9039..1bf5c2b7c7 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/ExoTrackSelection.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/ExoTrackSelection.java @@ -43,8 +43,10 @@ public interface ExoTrackSelection extends TrackSelection { final class Definition { /** The {@link TrackGroup} which tracks belong to. */ public final TrackGroup group; + /** The indices of the selected tracks in {@link #group}. */ public final int[] tracks; + /** The type that will be returned from {@link TrackSelection#getType()}. */ public final @Type int type; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/MappingTrackSelector.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/MappingTrackSelector.java index 2340da03a9..bc0de4ad25 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/MappingTrackSelector.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/MappingTrackSelector.java @@ -77,8 +77,10 @@ public abstract class MappingTrackSelector extends TrackSelector { RENDERER_SUPPORT_PLAYABLE_TRACKS }) public @interface RendererSupport {} + /** The renderer does not have any associated tracks. */ public static final int RENDERER_SUPPORT_NO_TRACKS = 0; + /** * The renderer has tracks mapped to it, but all are unsupported. In other words, {@link * #getTrackSupport(int, int, int)} returns {@link C#FORMAT_UNSUPPORTED_DRM}, {@link @@ -86,6 +88,7 @@ public abstract class MappingTrackSelector extends TrackSelector { * the renderer. */ public static final int RENDERER_SUPPORT_UNSUPPORTED_TRACKS = 1; + /** * The renderer has tracks mapped to it and at least one is of a supported type, but all such * tracks exceed the renderer's capabilities. In other words, {@link #getTrackSupport(int, int, @@ -93,6 +96,7 @@ public abstract class MappingTrackSelector extends TrackSelector { * renderer, but does not return {@link C#FORMAT_HANDLED} for any tracks mapped to the renderer. */ public static final int RENDERER_SUPPORT_EXCEEDS_CAPABILITIES_TRACKS = 2; + /** * The renderer has tracks mapped to it, and at least one such track is playable. In other * words, {@link #getTrackSupport(int, int, int)} returns {@link C#FORMAT_HANDLED} for at least diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelection.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelection.java index ff496ca5d9..47d1e87735 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelection.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelection.java @@ -47,8 +47,10 @@ public interface TrackSelection { open = true, value = {TYPE_UNSET}) @interface Type {} + /** An unspecified track selection type. */ int TYPE_UNSET = 0; + /** The first value that can be used for application specific track selection types. */ int TYPE_CUSTOM_BASE = 10000; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelectorResult.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelectorResult.java index f0187c08d7..a59284d84b 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelectorResult.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelectorResult.java @@ -28,15 +28,19 @@ public final class TrackSelectorResult { /** The number of selections in the result. Greater than or equal to zero. */ public final int length; + /** * A {@link RendererConfiguration} for each renderer. A null entry indicates the corresponding * renderer should be disabled. */ public final @NullableType RendererConfiguration[] rendererConfigurations; + /** A {@link ExoTrackSelection} array containing the track selection for each renderer. */ public final @NullableType ExoTrackSelection[] selections; + /** Describe the tracks and which one were selected. */ public final Tracks tracks; + /** * An opaque object that will be returned to {@link TrackSelector#onSelectionActivated(Object)} * should the selections be activated. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CachedRegionTracker.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CachedRegionTracker.java index bee8c01878..0c088324a1 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CachedRegionTracker.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CachedRegionTracker.java @@ -182,8 +182,10 @@ public final class CachedRegionTracker implements Cache.Listener { /** The first byte of the region (inclusive). */ public long startOffset; + /** End offset of the region (exclusive). */ public long endOffset; + /** * The index in chunkIndex that contains the end offset. May be -1 if the end offset comes * before the start of the first media chunk (i.e. if the end offset is within the stream diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CmcdConfiguration.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CmcdConfiguration.java index f1fffdbe30..f3efc1af13 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CmcdConfiguration.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CmcdConfiguration.java @@ -177,6 +177,7 @@ public final class CmcdConfiguration { * Maximum length is 64 characters. */ @Nullable public final String sessionId; + /** * A GUID identifying the current content, or {@code null} if unset. * @@ -184,6 +185,7 @@ public final class CmcdConfiguration { * updated at the discretion of the service provider. Maximum length is 64 characters. */ @Nullable public final String contentId; + /** Dynamic request specific configuration. */ public final RequestConfig requestConfig; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CmcdLog.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CmcdLog.java index 823c0a3867..82df4529f7 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CmcdLog.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CmcdLog.java @@ -155,6 +155,7 @@ public final class CmcdLog { * values, the peak value should be transmitted. */ public final int bitrateKbps; + /** * Custom data where the values of the keys vary with the object being requested, or {@code * null} if unset. @@ -239,6 +240,7 @@ public final class CmcdLog { *

This value MUST be rounded to the nearest 100 ms. */ public final long bufferLengthMs; + /** * Custom data where the values of the keys vary with each request, or {@code null} if unset. * @@ -331,6 +333,7 @@ public final class CmcdLog { * updated at the discretion of the service provider. Maximum length is 64 characters. */ @Nullable public final String contentId; + /** * A GUID identifying the current playback session, or {@code null} if unset. * @@ -338,6 +341,7 @@ public final class CmcdLog { * Maximum length is 64 characters. */ @Nullable public final String sessionId; + /** * Custom data where the values of the keys are expected to be invariant over the life of the * session, or {@code null} if unset. @@ -434,6 +438,7 @@ public final class CmcdLog { * 100kbps. */ public final int maximumRequestedThroughputKbps; + /** * Custom data where the values of the keys do not vary with every request or object, or {@code * null} if unset. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/DefaultBandwidthMeter.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/DefaultBandwidthMeter.java index 43a4f0f6db..c14c090452 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/DefaultBandwidthMeter.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/DefaultBandwidthMeter.java @@ -84,26 +84,31 @@ public final class DefaultBandwidthMeter implements BandwidthMeter, TransferList * #getInitialBitrateCountryGroupAssignment}. */ private static final int COUNTRY_GROUP_INDEX_WIFI = 0; + /** * Index for the 2G group index in the array returned by {@link * #getInitialBitrateCountryGroupAssignment}. */ private static final int COUNTRY_GROUP_INDEX_2G = 1; + /** * Index for the 3G group index in the array returned by {@link * #getInitialBitrateCountryGroupAssignment}. */ private static final int COUNTRY_GROUP_INDEX_3G = 2; + /** * Index for the 4G group index in the array returned by {@link * #getInitialBitrateCountryGroupAssignment}. */ private static final int COUNTRY_GROUP_INDEX_4G = 3; + /** * Index for the 5G-NSA group index in the array returned by {@link * #getInitialBitrateCountryGroupAssignment}. */ private static final int COUNTRY_GROUP_INDEX_5G_NSA = 4; + /** * Index for the 5G-SA group index in the array returned by {@link * #getInitialBitrateCountryGroupAssignment}. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/DefaultLoadErrorHandlingPolicy.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/DefaultLoadErrorHandlingPolicy.java index 6c5d66857a..39d5c78b64 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/DefaultLoadErrorHandlingPolicy.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/DefaultLoadErrorHandlingPolicy.java @@ -34,17 +34,21 @@ public class DefaultLoadErrorHandlingPolicy implements LoadErrorHandlingPolicy { /** The default minimum number of times to retry loading data prior to propagating the error. */ public static final int DEFAULT_MIN_LOADABLE_RETRY_COUNT = 3; + /** * The default minimum number of times to retry loading prior to failing for progressive live * streams. */ public static final int DEFAULT_MIN_LOADABLE_RETRY_COUNT_PROGRESSIVE_LIVE = 6; + /** The default duration for which a track is excluded in milliseconds. */ public static final long DEFAULT_TRACK_EXCLUSION_MS = 60_000; + /** * @deprecated Use {@link #DEFAULT_TRACK_EXCLUSION_MS} instead. */ @Deprecated public static final long DEFAULT_TRACK_BLACKLIST_MS = DEFAULT_TRACK_EXCLUSION_MS; + /** The default duration for which a location is excluded in milliseconds. */ public static final long DEFAULT_LOCATION_EXCLUSION_MS = 5 * 60_000; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/LoadErrorHandlingPolicy.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/LoadErrorHandlingPolicy.java index 40e5c13c2c..3315a96fb7 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/LoadErrorHandlingPolicy.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/LoadErrorHandlingPolicy.java @@ -65,6 +65,7 @@ public interface LoadErrorHandlingPolicy { * exact same data can be requested). */ int FALLBACK_TYPE_LOCATION = 1; + /** * Fallback to a different track (i.e., a different representation of the same content; for * example the same video encoded at a different bitrate or resolution). @@ -76,10 +77,13 @@ public interface LoadErrorHandlingPolicy { /** The {@link LoadEventInfo} associated with the load that encountered an error. */ public final LoadEventInfo loadEventInfo; + /** {@link MediaLoadData} associated with the load that encountered an error. */ public final MediaLoadData mediaLoadData; + /** The exception associated to the load error. */ public final IOException exception; + /** The number of errors this load task has encountered, including this one. */ public final int errorCount; @@ -100,10 +104,13 @@ public interface LoadErrorHandlingPolicy { final class FallbackOptions { /** The number of available locations. */ public final int numberOfLocations; + /** The number of locations that are already excluded. */ public final int numberOfExcludedLocations; + /** The number of tracks. */ public final int numberOfTracks; + /** The number of tracks that are already excluded. */ public final int numberOfExcludedTracks; @@ -131,6 +138,7 @@ public interface LoadErrorHandlingPolicy { final class FallbackSelection { /** The type of fallback. */ public final @FallbackType int type; + /** The duration for which the failing resource should be excluded, in milliseconds. */ public final long exclusionDurationMs; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/Loader.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/Loader.java index a033f1b4bb..2b9c45259d 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/Loader.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/Loader.java @@ -164,12 +164,15 @@ public final class Loader implements LoaderErrorThrower { /** Retries the load using the default delay. */ public static final LoadErrorAction RETRY = createRetryAction(/* resetErrorCount= */ false, C.TIME_UNSET); + /** Retries the load using the default delay and resets the error count. */ public static final LoadErrorAction RETRY_RESET_ERROR_COUNT = createRetryAction(/* resetErrorCount= */ true, C.TIME_UNSET); + /** Discards the failed {@link Loadable} and ignores any errors that have occurred. */ public static final LoadErrorAction DONT_RETRY = new LoadErrorAction(ACTION_TYPE_DONT_RETRY, C.TIME_UNSET); + /** * Discards the failed {@link Loadable}. The next call to {@link #maybeThrowError()} will throw * the last load error. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/ParsingLoadable.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/ParsingLoadable.java index 859f920713..c9aaa329fc 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/ParsingLoadable.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/ParsingLoadable.java @@ -93,8 +93,10 @@ public final class ParsingLoadable implements Loadable { /** Identifies the load task for this loadable. */ public final long loadTaskId; + /** The {@link DataSpec} that defines the data to be loaded. */ public final DataSpec dataSpec; + /** * The type of the data. One of the {@code DATA_TYPE_*} constants defined in {@link C}. For * reporting only. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/ExperimentalBandwidthMeter.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/ExperimentalBandwidthMeter.java index 9f00daf019..4486436e7d 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/ExperimentalBandwidthMeter.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/ExperimentalBandwidthMeter.java @@ -88,26 +88,31 @@ public final class ExperimentalBandwidthMeter implements BandwidthMeter, Transfe * #getInitialBitrateCountryGroupAssignment}. */ private static final int COUNTRY_GROUP_INDEX_WIFI = 0; + /** * Index for the 2G group index in the array returned by {@link * #getInitialBitrateCountryGroupAssignment}. */ private static final int COUNTRY_GROUP_INDEX_2G = 1; + /** * Index for the 3G group index in the array returned by {@link * #getInitialBitrateCountryGroupAssignment}. */ private static final int COUNTRY_GROUP_INDEX_3G = 2; + /** * Index for the 4G group index in the array returned by {@link * #getInitialBitrateCountryGroupAssignment}. */ private static final int COUNTRY_GROUP_INDEX_4G = 3; + /** * Index for the 5G-NSA group index in the array returned by {@link * #getInitialBitrateCountryGroupAssignment}. */ private static final int COUNTRY_GROUP_INDEX_5G_NSA = 4; + /** * Index for the 5G-SA group index in the array returned by {@link * #getInitialBitrateCountryGroupAssignment}. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/SlidingWeightedAverageBandwidthStatistic.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/SlidingWeightedAverageBandwidthStatistic.java index e4de6cd337..81895f915b 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/SlidingWeightedAverageBandwidthStatistic.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/SlidingWeightedAverageBandwidthStatistic.java @@ -34,8 +34,10 @@ public class SlidingWeightedAverageBandwidthStatistic implements BandwidthStatis public static class Sample { /** The sample bitrate. */ public final long bitrate; + /** The sample weight. */ public final double weight; + /** * The time this sample was added, in milliseconds. Timestamps should come from the same source, * so that samples can reliably be ordered in time. It is suggested to use {@link diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DecoderVideoRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DecoderVideoRenderer.java index e1e03f875b..b02b6fd3c8 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DecoderVideoRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DecoderVideoRenderer.java @@ -90,14 +90,17 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { REINITIALIZATION_STATE_WAIT_END_OF_STREAM }) private @interface ReinitializationState {} + /** The decoder does not need to be re-initialized. */ private static final int REINITIALIZATION_STATE_NONE = 0; + /** * The input format has changed in a way that requires the decoder to be re-initialized, but we * haven't yet signaled an end of stream to the existing decoder. We need to do so in order to * ensure that it outputs any remaining buffers before we release it. */ private static final int REINITIALIZATION_STATE_SIGNAL_END_OF_STREAM = 1; + /** * The input format has changed in a way that requires the decoder to be re-initialized, and we've * signaled an end of stream to the existing decoder. We're waiting for the decoder to output an diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/FixedFrameRateEstimator.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/FixedFrameRateEstimator.java index e0b47cae78..0a8a7ef56d 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/FixedFrameRateEstimator.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/FixedFrameRateEstimator.java @@ -27,6 +27,7 @@ import java.util.Arrays; /** The number of consecutive matching frame durations required to detect a fixed frame rate. */ public static final int CONSECUTIVE_MATCHING_FRAME_DURATIONS_FOR_SYNC = 15; + /** * The maximum amount frame durations can differ for them to be considered matching, in * nanoseconds. @@ -140,10 +141,13 @@ import java.util.Arrays; /** The total number of frames that have matched the frame duration being tracked. */ private long matchingFrameCount; + /** The sum of the frame durations of all matching frames. */ private long matchingFrameDurationSumNs; + /** Cyclic buffer of flags indicating whether the most recent frame durations were outliers. */ private final boolean[] recentFrameOutlierFlags; + /** * The number of recent frame durations that were outliers. Equal to the number of {@code true} * values in {@link #recentFrameOutlierFlags}. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java index fa161cf632..76ccd9beca 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java @@ -1930,6 +1930,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { @Nullable private VideoFrameProcessor videoFrameProcessor; @Nullable private CopyOnWriteArrayList videoEffects; @Nullable private Format inputFormat; + /** * The current frame {@link Format} and the earliest presentationTimeUs that associates to it. */ @@ -1957,6 +1958,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { private long lastCodecBufferPresentationTimestampUs; private VideoSize processedFrameSize; private boolean pendingOutputSizeChange; + /** The presentation time, after which the listener should be notified about the size change. */ private long pendingOutputSizeChangeNotificationTimeUs; @@ -2461,6 +2463,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { listener); } } + /** * Returns a maximum video size to use when configuring a codec for {@code format} in a way that * will allow possible adaptation to other compatible formats that are expected to have the same diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameReleaseHelper.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameReleaseHelper.java index bfac6433f6..11f179b974 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameReleaseHelper.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameReleaseHelper.java @@ -80,11 +80,13 @@ public final class VideoFrameReleaseHelper { /** The period between sampling display VSYNC timestamps, in milliseconds. */ private static final long VSYNC_SAMPLE_UPDATE_PERIOD_MS = 500; + /** * The maximum adjustment that can be made to a frame release timestamp, in nanoseconds, excluding * the part of the adjustment that aligns frame release timestamps with the display VSYNC. */ private static final long MAX_ALLOWED_ADJUSTMENT_NS = 20_000_000; + /** * If a frame is targeted to a display VSYNC with timestamp {@code vsyncTime}, the adjusted frame * release timestamp will be calculated as {@code releaseTime = vsyncTime - ((vsyncDuration * @@ -101,12 +103,14 @@ public final class VideoFrameReleaseHelper { /** The media frame rate specified in the {@link Format}. */ private float formatFrameRate; + /** * The media frame rate used to calculate the playback frame rate of the {@link Surface}. This may * be different to {@link #formatFrameRate} if {@link #formatFrameRate} is unspecified or * inaccurate. */ private float surfaceMediaFrameRate; + /** The playback frame rate set on the {@link Surface}. */ private float surfacePlaybackFrameRate; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/Projection.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/Projection.java index 98add9b58e..107522d667 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/Projection.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/Projection.java @@ -35,15 +35,19 @@ import java.lang.annotation.Target; @Target(TYPE_USE) @IntDef({DRAW_MODE_TRIANGLES, DRAW_MODE_TRIANGLES_STRIP, DRAW_MODE_TRIANGLES_FAN}) public @interface DrawMode {} + /** Triangle draw mode. */ public static final int DRAW_MODE_TRIANGLES = 0; + /** Triangle strip draw mode. */ public static final int DRAW_MODE_TRIANGLES_STRIP = 1; + /** Triangle fan draw mode. */ public static final int DRAW_MODE_TRIANGLES_FAN = 2; /** Number of position coordinates per vertex. */ public static final int TEXTURE_COORDS_PER_VERTEX = 2; + /** Number of texture coordinates per vertex. */ public static final int POSITION_COORDS_PER_VERTEX = 3; @@ -154,13 +158,16 @@ import java.lang.annotation.Target; /** The Mesh corresponding to the left eye. */ public final Mesh leftMesh; + /** * The Mesh corresponding to the right eye. If {@code singleMesh} is true then this mesh is * identical to {@link #leftMesh}. */ public final Mesh rightMesh; + /** The stereo mode. */ public final @StereoMode int stereoMode; + /** Whether the left and right mesh are identical. */ public final boolean singleMesh; @@ -196,10 +203,13 @@ import java.lang.annotation.Target; /** Texture ID. */ public final int textureId; + /** The drawing mode. One of {@link DrawMode}. */ public final @DrawMode int mode; + /** The SubMesh vertices. */ public final float[] vertices; + /** The SubMesh texture coordinates. */ public final float[] textureCoords; diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/offline/DownloadManagerTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/offline/DownloadManagerTest.java index 337736d9e3..e3bdc1343f 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/offline/DownloadManagerTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/offline/DownloadManagerTest.java @@ -51,10 +51,13 @@ public class DownloadManagerTest { /** Timeout to use when blocking on conditions that we expect to become unblocked. */ private static final int TIMEOUT_MS = 10_000; + /** An application provided stop reason. */ private static final int APP_STOP_REASON = 1; + /** The minimum number of times a download must be retried before failing. */ private static final int MIN_RETRY_COUNT = 3; + /** Test value for the current time. */ private static final long NOW_MS = 1234; diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/SampleQueueTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/SampleQueueTest.java index a7f935ef17..410a8c8f40 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/SampleQueueTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/SampleQueueTest.java @@ -123,6 +123,7 @@ public final class SampleQueueTest { private static final long[] ENCRYPTED_SAMPLE_TIMESTAMPS = new long[] {0, 1000, 2000, 3000}; private static final Format[] ENCRYPTED_SAMPLE_FORMATS = new Format[] {FORMAT_ENCRYPTED, FORMAT_ENCRYPTED, FORMAT_1, FORMAT_ENCRYPTED}; + /** Encrypted samples require the encryption preamble. */ private static final int[] ENCRYPTED_SAMPLE_SIZES = new int[] {1, 3, 1, 3}; diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java index fede790776..71586a83b0 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java @@ -367,10 +367,12 @@ public final class DashMediaSource extends BaseMediaSource { * if no value is defined in the {@link MediaItem} or the manifest. */ public static final long DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS = 30_000; + /** * @deprecated Use {@link #DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS} instead. */ @Deprecated public static final long DEFAULT_LIVE_PRESENTATION_DELAY_MS = 30_000; + /** The media id used by media items of dash media sources without a manifest URI. */ public static final String DEFAULT_MEDIA_ID = "DashMediaSource"; diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/BaseUrl.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/BaseUrl.java index 6f2dc6c800..21ecb512b8 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/BaseUrl.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/BaseUrl.java @@ -25,17 +25,22 @@ public final class BaseUrl { /** The default weight. */ public static final int DEFAULT_WEIGHT = 1; + /** The default priority. */ public static final int DEFAULT_DVB_PRIORITY = 1; + /** Constant representing an unset priority in a manifest that does not declare a DVB profile. */ public static final int PRIORITY_UNSET = Integer.MIN_VALUE; /** The URL. */ public final String url; + /** The service location. */ public final String serviceLocation; + /** The priority. */ public final int priority; + /** The weight. */ public final int weight; diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/Descriptor.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/Descriptor.java index 7e3aae9d27..66e2d56f86 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/Descriptor.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/Descriptor.java @@ -25,8 +25,10 @@ public final class Descriptor { /** The scheme URI. */ public final String schemeIdUri; + /** The value, or null. */ @Nullable public final String value; + /** The identifier, or null. */ @Nullable public final String id; diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/Representation.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/Representation.java index e3422a8a2f..f17ec5477b 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/Representation.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/Representation.java @@ -44,16 +44,22 @@ public abstract class Representation { * often a suitable. */ public final long revisionId; + /** The format of the representation. */ public final Format format; + /** The base URLs of the representation. */ public final ImmutableList baseUrls; + /** The offset of the presentation timestamps in the media stream relative to media time. */ public final long presentationTimeOffsetUs; + /** The in-band event streams in the representation. May be empty. */ public final List inbandEventStreams; + /** Essential properties in the representation. May be empty. */ public final List essentialProperties; + /** Supplemental properties in the adaptation set. May be empty. */ public final List supplementalProperties; @@ -181,6 +187,7 @@ public abstract class Representation { /** The uri of the single segment. */ public final Uri uri; + /** The content length, or {@link C#LENGTH_UNSET} if unknown. */ public final long contentLength; diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/ServiceDescriptionElement.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/ServiceDescriptionElement.java index 209815976a..3d737c069f 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/ServiceDescriptionElement.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/ServiceDescriptionElement.java @@ -24,15 +24,19 @@ public final class ServiceDescriptionElement { /** The target live offset in milliseconds, or {@link C#TIME_UNSET} if undefined. */ public final long targetOffsetMs; + /** The minimum live offset in milliseconds, or {@link C#TIME_UNSET} if undefined. */ public final long minOffsetMs; + /** The maximum live offset in milliseconds, or {@link C#TIME_UNSET} if undefined. */ public final long maxOffsetMs; + /** * The minimum factor by which playback can be sped up for live speed adjustment, or {@link * C#RATE_UNSET} if undefined. */ public final float minPlaybackSpeed; + /** * The maximum factor by which playback can be sped up for live speed adjustment, or {@link * C#RATE_UNSET} if undefined. diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsChunkSource.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsChunkSource.java index 56d74f8785..ad0631321a 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsChunkSource.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsChunkSource.java @@ -107,8 +107,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** Indicates that the chunk is based on a preload hint. */ public static final int CHUNK_PUBLICATION_STATE_PRELOAD = 0; + /** Indicates that the chunk is definitely published. */ public static final int CHUNK_PUBLICATION_STATE_PUBLISHED = 1; + /** * Indicates that the chunk has been removed from the playlist. * diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsManifest.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsManifest.java index d7e974aecc..7e1791d8fb 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsManifest.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsManifest.java @@ -25,6 +25,7 @@ public final class HlsManifest { /** The multivariant playlist of an HLS stream. */ public final HlsMultivariantPlaylist multivariantPlaylist; + /** A snapshot of a media playlist referred to by {@link #multivariantPlaylist}. */ public final HlsMediaPlaylist mediaPlaylist; diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java index 8ca9750ce3..08144895fb 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java @@ -93,6 +93,7 @@ public final class HlsMediaSource extends BaseMediaSource /** Type for ID3 metadata in HLS streams. */ public static final int METADATA_TYPE_ID3 = 1; + /** Type for ESMG metadata in HLS streams. */ public static final int METADATA_TYPE_EMSG = 3; diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsTrackMetadataEntry.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsTrackMetadataEntry.java index 37f98e68fa..5f864a4dd1 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsTrackMetadataEntry.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsTrackMetadataEntry.java @@ -164,11 +164,13 @@ public final class HlsTrackMetadataEntry implements Metadata.Entry { * track is not derived from an EXT-X-MEDIA TAG. */ @Nullable public final String groupId; + /** * The NAME value of this track, if the track is derived from an EXT-X-MEDIA tag. Null if the * track is not derived from an EXT-X-MEDIA TAG. */ @Nullable public final String name; + /** * The EXT-X-STREAM-INF tags attributes associated with this track. This field is non-applicable * (and therefore empty) if this track is derived from an EXT-X-MEDIA tag. diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsMediaPlaylist.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsMediaPlaylist.java index 5e6baec46b..0555f37be9 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsMediaPlaylist.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsMediaPlaylist.java @@ -49,20 +49,24 @@ public final class HlsMediaPlaylist extends HlsPlaylist { * are not supported. */ public final long skipUntilUs; + /** * Whether the playlist can produce delta updates that skip older #EXT-X-DATERANGE tags in * addition to media segments. */ public final boolean canSkipDateRanges; + /** * The server-recommended live offset in microseconds, or {@link C#TIME_UNSET} if none defined. */ public final long holdBackUs; + /** * The server-recommended live offset in microseconds in low-latency mode, or {@link * C#TIME_UNSET} if none defined. */ public final long partHoldBackUs; + /** Whether the server supports blocking playlist reload. */ public final boolean canBlockReload; @@ -95,6 +99,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { /** The human readable title of the segment. */ public final String title; + /** The parts belonging to this segment. */ public final List parts; @@ -206,6 +211,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { /** Whether the part is independent. */ public final boolean isIndependent; + /** Whether the part is a preloading part. */ public final boolean isPreload; @@ -279,44 +285,54 @@ public final class HlsMediaPlaylist extends HlsPlaylist { public static class SegmentBase implements Comparable { /** The url of the segment. */ public final String url; + /** * The media initialization section for this segment, as defined by #EXT-X-MAP. May be null if * the media playlist does not define a media initialization section for this segment. The same * instance is used for all segments that share an EXT-X-MAP tag. */ @Nullable public final Segment initializationSegment; + /** The duration of the segment in microseconds, as defined by #EXTINF or #EXT-X-PART. */ public final long durationUs; + /** The number of #EXT-X-DISCONTINUITY tags in the playlist before the segment. */ public final int relativeDiscontinuitySequence; + /** The start time of the segment in microseconds, relative to the start of the playlist. */ public final long relativeStartTimeUs; + /** * DRM initialization data for sample decryption, or null if the segment does not use CDM-DRM * protection. */ @Nullable public final DrmInitData drmInitData; + /** * The encryption identity key uri as defined by #EXT-X-KEY, or null if the segment does not use * full segment encryption with identity key. */ @Nullable public final String fullSegmentEncryptionKeyUri; + /** * The encryption initialization vector as defined by #EXT-X-KEY, or null if the segment is not * encrypted. */ @Nullable public final String encryptionIV; + /** * The segment's byte range offset, as defined by #EXT-X-BYTERANGE, #EXT-X-PART or * #EXT-X-PRELOAD-HINT. */ public final long byteRangeOffset; + /** * The segment's byte range length, as defined by #EXT-X-BYTERANGE, #EXT-X-PART or * #EXT-X-PRELOAD-HINT, or {@link C#LENGTH_UNSET} if no byte range is specified or the byte * range is open-ended. */ public final long byteRangeLength; + /** Whether the segment is marked as a gap. */ public final boolean hasGapTag; @@ -361,8 +377,10 @@ public final class HlsMediaPlaylist extends HlsPlaylist { public static final class RenditionReport { /** The URI of the media playlist of the reported rendition. */ public final Uri playlistUri; + /** The last media sequence that is in the playlist of the reported rendition. */ public final long lastMediaSequence; + /** * The last part index that is in the playlist of the reported rendition, or {@link * C#INDEX_UNSET} if the rendition does not contain partial segments. @@ -399,65 +417,83 @@ public final class HlsMediaPlaylist extends HlsPlaylist { /** The type of the playlist. See {@link PlaylistType}. */ public final @PlaylistType int playlistType; + /** * The start offset in microseconds from the beginning of the playlist, as defined by * #EXT-X-START, or {@link C#TIME_UNSET} if undefined. The value is guaranteed to be between 0 and * {@link #durationUs}, inclusive. */ public final long startOffsetUs; + /** * Whether the {@link #startOffsetUs} was explicitly defined by #EXT-X-START as a positive value * or zero. */ public final boolean hasPositiveStartOffset; + /** Whether the start position should be precise, as defined by #EXT-X-START. */ public final boolean preciseStart; + /** * If {@link #hasProgramDateTime} is true, contains the datetime as microseconds since epoch. * Otherwise, contains the aggregated duration of removed segments up to this snapshot of the * playlist. */ public final long startTimeUs; + /** Whether the playlist contains the #EXT-X-DISCONTINUITY-SEQUENCE tag. */ public final boolean hasDiscontinuitySequence; + /** * The discontinuity sequence number of the first media segment in the playlist, as defined by * #EXT-X-DISCONTINUITY-SEQUENCE. */ public final int discontinuitySequence; + /** * The media sequence number of the first media segment in the playlist, as defined by * #EXT-X-MEDIA-SEQUENCE. */ public final long mediaSequence; + /** The compatibility version, as defined by #EXT-X-VERSION. */ public final int version; + /** The target duration in microseconds, as defined by #EXT-X-TARGETDURATION. */ public final long targetDurationUs; + /** * The target duration for segment parts, as defined by #EXT-X-PART-INF, or {@link C#TIME_UNSET} * if undefined. */ public final long partTargetDurationUs; + /** Whether the playlist contains the #EXT-X-ENDLIST tag. */ public final boolean hasEndTag; + /** Whether the playlist contains a #EXT-X-PROGRAM-DATE-TIME tag. */ public final boolean hasProgramDateTime; + /** * Contains the CDM protection schemes used by segments in this playlist. Does not contain any key * acquisition data. Null if none of the segments in the playlist is CDM-encrypted. */ @Nullable public final DrmInitData protectionSchemes; + /** The list of segments in the playlist. */ public final List segments; + /** * The list of parts at the end of the playlist for which the segment is not in the playlist yet. */ public final List trailingParts; + /** The rendition reports of alternative rendition playlists. */ public final Map renditionReports; + /** The total duration of the playlist in microseconds. */ public final long durationUs; + /** The attributes of the #EXT-X-SERVER-CONTROL header. */ public final ServerControl serverControl; diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsMultivariantPlaylist.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsMultivariantPlaylist.java index 6f70689a06..cd174f371d 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsMultivariantPlaylist.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsMultivariantPlaylist.java @@ -151,14 +151,19 @@ public final class HlsMultivariantPlaylist extends HlsPlaylist { /** All of the media playlist URLs referenced by the playlist. */ public final List mediaPlaylistUrls; + /** The variants declared by the playlist. */ public final List variants; + /** The video renditions declared by the playlist. */ public final List videos; + /** The audio renditions declared by the playlist. */ public final List audios; + /** The subtitle renditions declared by the playlist. */ public final List subtitles; + /** The closed caption renditions declared by the playlist. */ public final List closedCaptions; @@ -167,14 +172,17 @@ public final class HlsMultivariantPlaylist extends HlsPlaylist { * muxed audio. */ @Nullable public final Format muxedAudioFormat; + /** * The format of the closed captions declared by the playlist. May be empty if the playlist * explicitly declares no captions are available, or null if the playlist does not declare any * captions information. */ @Nullable public final List muxedCaptionFormats; + /** Contains variable definitions, as defined by the #EXT-X-DEFINE tag. */ public final Map variableDefinitions; + /** DRM initialization data derived from #EXT-X-SESSION-KEY tags. */ public final List sessionKeyDrmInitData; diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsPlaylist.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsPlaylist.java index 29d1199a9a..1d7b410ed8 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsPlaylist.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsPlaylist.java @@ -26,8 +26,10 @@ public abstract class HlsPlaylist implements FilterableManifest { /** The base uri. Used to resolve relative paths. */ public final String baseUri; + /** The list of tags in the playlist. */ public final List tags; + /** * Whether the media is formed of independent segments, as defined by the * #EXT-X-INDEPENDENT-SEGMENTS tag. diff --git a/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/AdTagLoader.java b/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/AdTagLoader.java index 91d91c2e23..c1dd3737a3 100644 --- a/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/AdTagLoader.java +++ b/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/AdTagLoader.java @@ -103,11 +103,13 @@ import java.util.Map; * player buffers, in milliseconds. */ private static final long THRESHOLD_END_OF_CONTENT_MS = 5000; + /** * Threshold before the start of an ad at which IMA is expected to be able to preload the ad, in * milliseconds. */ private static final long THRESHOLD_AD_PRELOAD_MS = 4000; + /** The threshold below which ad cue points are treated as matching, in microseconds. */ private static final long THRESHOLD_AD_MATCH_US = 1000; @@ -120,11 +122,13 @@ import java.util.Map; /** The ad playback state when IMA is not playing an ad. */ private static final int IMA_AD_STATE_NONE = 0; + /** * The ad playback state when IMA has called {@link ComponentListener#playAd(AdMediaInfo)} and not * {@link ComponentListener##pauseAd(AdMediaInfo)}. */ private static final int IMA_AD_STATE_PLAYING = 1; + /** * The ad playback state when IMA has called {@link ComponentListener#pauseAd(AdMediaInfo)} while * playing an ad. @@ -166,12 +170,16 @@ import java.util.Map; /** Whether IMA has sent an ad event to pause content since the last resume content event. */ private boolean imaPausedContent; + /** The current ad playback state. */ private @ImaAdState int imaAdState; + /** The current ad media info, or {@code null} if in state {@link #IMA_AD_STATE_NONE}. */ @Nullable private AdMediaInfo imaAdMediaInfo; + /** The current ad info, or {@code null} if in state {@link #IMA_AD_STATE_NONE}. */ @Nullable private AdInfo imaAdInfo; + /** Whether IMA has been notified that playback of content has finished. */ private boolean sentContentComplete; @@ -179,18 +187,22 @@ import java.util.Map; /** Whether the player is playing an ad. */ private boolean playingAd; + /** Whether the player is buffering an ad. */ private boolean bufferingAd; + /** * If the player is playing an ad, stores the ad index in its ad group. {@link C#INDEX_UNSET} * otherwise. */ private int playingAdIndexInAdGroup; + /** * The ad info for a pending ad for which the media failed preparation, or {@code null} if no * pending ads have failed to prepare. */ @Nullable private AdInfo pendingAdPrepareErrorAdInfo; + /** * If a content period has finished but IMA has not yet called {@link * ComponentListener#playAd(AdMediaInfo)}, stores the value of {@link @@ -198,18 +210,22 @@ import java.util.Map; * a fake, increasing content position. {@link C#TIME_UNSET} otherwise. */ private long fakeContentProgressElapsedRealtimeMs; + /** * If {@link #fakeContentProgressElapsedRealtimeMs} is set, stores the offset from which the * content progress should increase. {@link C#TIME_UNSET} otherwise. */ private long fakeContentProgressOffsetMs; + /** Stores the pending content position when a seek operation was intercepted to play an ad. */ private long pendingContentPositionMs; + /** * Whether {@link ComponentListener#getContentProgress()} has sent {@link * #pendingContentPositionMs} to IMA. */ private boolean sentPendingContentPositionMs; + /** * Stores the real time in milliseconds at which the player started buffering, possibly due to not * having preloaded an ad, or {@link C#TIME_UNSET} if not applicable. diff --git a/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaUtil.java b/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaUtil.java index 60ae1cd4b7..255b90ffd5 100644 --- a/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaUtil.java +++ b/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaUtil.java @@ -83,18 +83,22 @@ import java.util.Set; public interface ImaFactory { /** Creates {@link ImaSdkSettings} for configuring the IMA SDK. */ ImaSdkSettings createImaSdkSettings(); + /** * Creates {@link AdsRenderingSettings} for giving the {@link AdsManager} parameters that * control rendering of ads. */ AdsRenderingSettings createAdsRenderingSettings(); + /** * Creates an {@link AdDisplayContainer} to hold the player for video ads, a container for * non-linear ads, and slots for companion ads. */ AdDisplayContainer createAdDisplayContainer(ViewGroup container, VideoAdPlayer player); + /** Creates an {@link AdDisplayContainer} to hold the player for audio ads. */ AdDisplayContainer createAudioAdDisplayContainer(Context context, VideoAdPlayer player); + /** * Creates a {@link FriendlyObstruction} to describe an obstruction considered "friendly" for * viewability measurement purposes. @@ -103,8 +107,10 @@ import java.util.Set; View view, FriendlyObstructionPurpose friendlyObstructionPurpose, @Nullable String reasonDetail); + /** Creates an {@link AdsRequest} to contain the data used to request ads. */ AdsRequest createAdsRequest(); + /** Creates an {@link AdsLoader} for requesting ads using the specified settings. */ AdsLoader createAdsLoader( Context context, ImaSdkSettings imaSdkSettings, AdDisplayContainer adDisplayContainer); diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/MediaDescription.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/MediaDescription.java index 26d8078721..66ac29c998 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/MediaDescription.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/MediaDescription.java @@ -62,10 +62,13 @@ import java.util.HashMap; /** The assigned RTP payload type. */ public final int payloadType; + /** The encoding method used in the RTP stream. */ public final String mediaEncoding; + /** The clock rate used in the RTP stream. */ public final int clockRate; + /** The optional encoding parameter. */ public final int encodingParameters; @@ -271,31 +274,43 @@ import java.util.HashMap; @StringDef({MEDIA_TYPE_VIDEO, MEDIA_TYPE_AUDIO}) @Documented public @interface MediaType {} + /** Audio media type. */ public static final String MEDIA_TYPE_AUDIO = "audio"; + /** Video media type. */ public static final String MEDIA_TYPE_VIDEO = "video"; + /** Default RTP/AVP profile. */ public static final String RTP_AVP_PROFILE = "RTP/AVP"; /** The {@link MediaType}. */ @MediaType public final String mediaType; + /** The associated port number. */ public final int port; + /** The protocol used for data transport. */ public final String transportProtocol; + /** The assigned RTP payload type. */ public final int payloadType; + /** The estimated connection bitrate in bits per second. */ public final int bitrate; + /** The assigned media title. */ @Nullable public final String mediaTitle; + /** The connection parameters. */ @Nullable public final String connection; + /** The encryption parameter. */ @Nullable public final String key; + /** The media-specific attributes. */ public final ImmutableMap attributes; + /** The mandatory rtpmap attribute in the media description (RFC2327 Page 22). */ public final RtpMapAttribute rtpMapAttribute; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtpDataLoadable.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtpDataLoadable.java index debd66c472..7f2f959994 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtpDataLoadable.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtpDataLoadable.java @@ -68,6 +68,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** The track ID associated with the Loadable. */ public final int trackId; + /** The {@link RtspMediaTrack} to load. */ public final RtspMediaTrack rtspMediaTrack; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtpPacket.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtpPacket.java index 6df3023b37..7f3add3b75 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtpPacket.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtpPacket.java @@ -158,15 +158,19 @@ public final class RtpPacket { /** The RTP version field (Word 0, bits 0-1), should always be 2. */ public final byte version = RTP_VERSION; + /** The RTP padding bit (Word 0, bit 2). */ public final boolean padding; + /** The RTP extension bit (Word 0, bit 3). */ public final boolean extension; + /** The RTP CSRC count field (Word 0, bits 4-7). */ public final byte csrcCount; /** The RTP marker bit (Word 0, bit 8). */ public final boolean marker; + /** The RTP CSRC count field (Word 0, bits 9-15). */ public final byte payloadType; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtpPayloadFormat.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtpPayloadFormat.java index db768b84dc..92a8fb052c 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtpPayloadFormat.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtpPayloadFormat.java @@ -139,12 +139,16 @@ public final class RtpPayloadFormat { /** The payload type associated with this format. */ public final int rtpPayloadType; + /** The clock rate in Hertz, associated with the format. */ public final int clockRate; + /** The {@link Format} of this RTP payload. */ public final Format format; + /** The format parameters, mapped from the SDP FMTP attribute (RFC2327 Page 22). */ public final ImmutableMap fmtpParameters; + /** The RTP media encoding. */ public final String mediaEncoding; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspAuthenticationInfo.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspAuthenticationInfo.java index d6e8a7db58..d269586dfa 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspAuthenticationInfo.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspAuthenticationInfo.java @@ -44,6 +44,7 @@ import java.security.NoSuchAlgorithmException; /** HTTP basic authentication (RFC2068 Section 11.1). */ public static final int BASIC = 1; + /** HTTP digest authentication (RFC2069). */ public static final int DIGEST = 2; @@ -62,10 +63,13 @@ import java.security.NoSuchAlgorithmException; /** The authentication mechanism. */ public final @AuthenticationMechanism int authenticationMechanism; + /** The authentication realm. */ public final String realm; + /** The nonce used in digest authentication; empty if using {@link #BASIC} authentication. */ public final String nonce; + /** The opaque used in digest authentication; empty if using {@link #BASIC} authentication. */ public final String opaque; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspClient.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspClient.java index f04b1a62c5..1589a2c43d 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspClient.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspClient.java @@ -84,12 +84,16 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @Target(TYPE_USE) @IntDef({RTSP_STATE_UNINITIALIZED, RTSP_STATE_INIT, RTSP_STATE_READY, RTSP_STATE_PLAYING}) public @interface RtspState {} + /** RTSP uninitialized state, the state before sending any SETUP request. */ public static final int RTSP_STATE_UNINITIALIZED = -1; + /** RTSP initial state, the state after sending SETUP REQUEST. */ public static final int RTSP_STATE_INIT = 0; + /** RTSP ready state, the state after receiving SETUP, or PAUSE response. */ public static final int RTSP_STATE_READY = 1; + /** RTSP playing state, the state after receiving PLAY response. */ public static final int RTSP_STATE_PLAYING = 2; @@ -100,6 +104,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; public interface SessionInfoListener { /** Called when the session information is available. */ void onSessionTimelineUpdated(RtspSessionTiming timing, ImmutableList tracks); + /** * Called when failed to get session information from the RTSP server, or when error happened * during updating the session timeline. diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspDescribeResponse.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspDescribeResponse.java index 209e072a40..20c711b8ad 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspDescribeResponse.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspDescribeResponse.java @@ -22,8 +22,10 @@ import androidx.media3.common.util.UnstableApi; /* package */ final class RtspDescribeResponse { /** The response's headers. */ public final RtspHeaders headers; + /** The response's status code. */ public final int status; + /** The {@link SessionDescription} (see RFC2327) in the DESCRIBE response. */ public final SessionDescription sessionDescription; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMediaTrack.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMediaTrack.java index 6bcf3dcf30..6d93fd51a4 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMediaTrack.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMediaTrack.java @@ -62,12 +62,15 @@ import com.google.common.collect.ImmutableMap; /** Prefix for the RFC6381 codecs string for AAC formats. */ private static final String AAC_CODECS_PREFIX = "mp4a.40."; + /** Prefix for the RFC6381 codecs string for AVC formats. */ private static final String H264_CODECS_PREFIX = "avc1."; + /** Prefix for the RFC6416 codecs string for MPEG4V-ES formats. */ private static final String MPEG4_CODECS_PREFIX = "mp4v."; private static final String GENERIC_CONTROL_ATTR = "*"; + /** * Default height for MP4V. * @@ -97,6 +100,7 @@ import com.google.common.collect.ImmutableMap; * software VP8 decoder. */ private static final int DEFAULT_VP8_WIDTH = 320; + /** * Default height for VP8. * @@ -120,6 +124,7 @@ import com.google.common.collect.ImmutableMap; * software VP9 decoder. */ private static final int DEFAULT_VP9_WIDTH = 320; + /** * Default height for VP9. * @@ -140,6 +145,7 @@ import com.google.common.collect.ImmutableMap; * >Android's software H263 decoder. */ private static final int DEFAULT_H263_WIDTH = 352; + /** * Default height for H263. * @@ -152,6 +158,7 @@ import com.google.common.collect.ImmutableMap; /** The track's associated {@link RtpPayloadFormat}. */ public final RtpPayloadFormat payloadFormat; + /** The track's URI. */ public final Uri uri; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMessageUtil.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMessageUtil.java index 16e5dd7c19..ebdb61e91e 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMessageUtil.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMessageUtil.java @@ -54,6 +54,7 @@ import java.util.regex.Pattern; public static final class RtspSessionHeader { /** The session ID. */ public final String sessionId; + /** * The session timeout, measured in milliseconds, {@link #DEFAULT_RTSP_TIMEOUT_MS} if not * specified in the Session header. @@ -71,6 +72,7 @@ import java.util.regex.Pattern; public static final class RtspAuthUserInfo { /** The username. */ public final String username; + /** The password. */ public final String password; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspOptionsResponse.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspOptionsResponse.java index 74d067c291..9b3f564976 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspOptionsResponse.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspOptionsResponse.java @@ -24,6 +24,7 @@ import java.util.List; /* package */ final class RtspOptionsResponse { /** The response's status code. */ public final int status; + /** * A list of methods supported by the RTSP server, encoded as {@link RtspRequest.Method}; or an * empty list if the server does not disclose the supported methods. diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspPlayResponse.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspPlayResponse.java index 6b7e43576a..a7117c22b2 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspPlayResponse.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspPlayResponse.java @@ -24,8 +24,10 @@ import java.util.List; /* package */ final class RtspPlayResponse { /** The response's status code. */ public final int status; + /** The playback start timing, {@link RtspSessionTiming#DEFAULT} if not present. */ public final RtspSessionTiming sessionTiming; + /** The list of {@link RtspTrackTiming} representing the {@link RtspHeaders#RTP_INFO} header. */ public final ImmutableList trackTimingList; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspRequest.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspRequest.java index 23cff58977..f3661348e8 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspRequest.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspRequest.java @@ -87,10 +87,13 @@ import java.lang.annotation.Target; /** The {@link Uri} to which this request is sent. */ public final Uri uri; + /** The request method, as defined in {@link Method}. */ public final @Method int method; + /** The headers of this request. */ public final RtspHeaders headers; + /** The body of this RTSP message, or empty string if absent. */ public final String messageBody; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspResponse.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspResponse.java index 81134a1cdf..efa99cba72 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspResponse.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspResponse.java @@ -24,8 +24,10 @@ import androidx.media3.common.util.UnstableApi; /** The status code of this response, as defined in RFC 2326 section 11. */ public final int status; + /** The headers of this response. */ public final RtspHeaders headers; + /** The body of this RTSP message, or empty string if absent. */ public final String messageBody; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspSessionTiming.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspSessionTiming.java index c637bb5ae3..987caed782 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspSessionTiming.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspSessionTiming.java @@ -86,6 +86,7 @@ import java.util.regex.Pattern; * always zero. */ public final long startTimeMs; + /** * The stop time of the session, in milliseconds, or {@link C#TIME_UNSET} when the stop time is * not set, for example when playing a live session. diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspSetupResponse.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspSetupResponse.java index 881ae9ef3a..a62664ec1b 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspSetupResponse.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspSetupResponse.java @@ -23,8 +23,10 @@ import androidx.media3.common.util.UnstableApi; /** The response's status code. */ public final int status; + /** The Session header (RFC2326 Section 12.37). */ public final RtspMessageUtil.RtspSessionHeader sessionHeader; + /** The Transport header (RFC2326 Section 12.39). */ public final String transport; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspTrackTiming.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspTrackTiming.java index 346f0555ba..4484ead99c 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspTrackTiming.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspTrackTiming.java @@ -152,12 +152,14 @@ import com.google.common.collect.ImmutableList; *

Cannot be {@link C#TIME_UNSET} if {@link #sequenceNumber} is {@link C#INDEX_UNSET}. */ public final long rtpTimestamp; + /** * The sequence number of the next RTP packet, {@link C#INDEX_UNSET} if not present. * *

Cannot be {@link C#INDEX_UNSET} if {@link #rtpTimestamp} is {@link C#TIME_UNSET}. */ public final int sequenceNumber; + /** The {@link Uri} that identifies a matching {@link RtspMediaTrack}. */ public final Uri uri; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/SessionDescription.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/SessionDescription.java index f7fc7ae5fa..49184ecebe 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/SessionDescription.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/SessionDescription.java @@ -222,18 +222,25 @@ import java.util.HashMap; /** The only supported SDP version, will be checked against every SDP message received. */ public static final String SUPPORTED_SDP_VERSION = "0"; + /** The control attribute name. */ public static final String ATTR_CONTROL = "control"; + /** The format property attribute name. */ public static final String ATTR_FMTP = "fmtp"; + /** The length property attribute name. */ public static final String ATTR_LENGTH = "length"; + /** The range property attribute name. */ public static final String ATTR_RANGE = "range"; + /** The RTP format mapping property attribute name. */ public static final String ATTR_RTPMAP = "rtpmap"; + /** The tool property attribute name. */ public static final String ATTR_TOOL = "tool"; + /** The type property attribute name. */ public static final String ATTR_TYPE = "type"; @@ -242,28 +249,39 @@ import java.util.HashMap; * present. */ public final ImmutableMap attributes; + /** * The {@link MediaDescription MediaDescriptions} for each media track included in the session. */ public final ImmutableList mediaDescriptionList; + /** The name of a session. */ @Nullable public final String sessionName; + /** The origin sender info. */ @Nullable public final String origin; + /** The timing info. */ @Nullable public final String timing; + /** The estimated bitrate in bits per seconds. */ public final int bitrate; + /** The uri of a linked content. */ @Nullable public final Uri uri; + /** The connection info. */ @Nullable public final String connection; + /** The encryption method and key info. */ @Nullable public final String key; + /** The email info. */ @Nullable public final String emailAddress; + /** The phone number info. */ @Nullable public final String phoneNumber; + /** The session info, a detailed description of the session. */ @Nullable public final String sessionInfo; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAacReader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAacReader.java index 456b911970..652876c589 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAacReader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAacReader.java @@ -36,6 +36,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** AAC low bit rate mode, RFC3640 Section 3.3.5. */ private static final String AAC_LOW_BITRATE_MODE = "AAC-lbr"; + /** AAC high bit rate mode, RFC3640 Section 3.3.6. */ private static final String AAC_HIGH_BITRATE_MODE = "AAC-hbr"; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAc3Reader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAc3Reader.java index 676476620e..707404ae62 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAc3Reader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAc3Reader.java @@ -36,8 +36,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** AC3 frame types defined in RFC4184 Section 4.1.1. */ private static final int AC3_FRAME_TYPE_COMPLETE_FRAME = 0; + /** Initial fragment of frame which includes the first 5/8ths of the frame. */ private static final int AC3_FRAME_TYPE_INITIAL_FRAGMENT_A = 1; + /** Initial fragment of frame which does not include the first 5/8ths of the frame. */ private static final int AC3_FRAME_TYPE_INITIAL_FRAGMENT_B = 2; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAmrReader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAmrReader.java index b175fcea7f..bf3439bc89 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAmrReader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAmrReader.java @@ -37,6 +37,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; */ /* package */ final class RtpAmrReader implements RtpPayloadReader { private static final String TAG = "RtpAmrReader"; + /** * The frame size in bytes, including header (1 byte), for each of the 16 frame types for AMR-NB * (narrow band). AMR-NB supports eight narrow band speech encoding modes with bit rates between diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH263Reader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH263Reader.java index cb3512c523..45631a43fb 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH263Reader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH263Reader.java @@ -65,6 +65,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private boolean isOutputFormatSet; private long startTimeOffsetUs; private long fragmentedSampleTimeUs; + /** * Whether the first packet of a H263 frame is received, it mark the start of a H263 partition. A * H263 frame can be split into multiple RTP packets. diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH264Reader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH264Reader.java index 0403ecf6bc..836692e5c6 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH264Reader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH264Reader.java @@ -44,6 +44,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; /** Single Time Aggregation Packet type A. */ private static final int RTP_PACKET_TYPE_STAP_A = 24; + /** Fragmentation Unit type A. */ private static final int RTP_PACKET_TYPE_FU_A = 28; @@ -63,6 +64,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private long firstReceivedTimestamp; private int previousSequenceNumber; + /** The combined size of a sample that is fragmented into multiple RTP packets. */ private int fragmentedSampleSizeBytes; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH265Reader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH265Reader.java index 2f77918dae..e59e680a2c 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH265Reader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH265Reader.java @@ -40,12 +40,16 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private static final String TAG = "RtpH265Reader"; private static final int MEDIA_CLOCK_FREQUENCY = 90_000; + /** Offset of payload data within a FU payload. */ private static final int FU_PAYLOAD_OFFSET = 3; + /** Aggregation Packet. RFC7798 Section 4.4.2. */ private static final int RTP_PACKET_TYPE_AP = 48; + /** Fragmentation Unit. RFC7798 Section 4.4.3. */ private static final int RTP_PACKET_TYPE_FU = 49; + /** IDR NAL unit types. */ private static final int NAL_IDR_W_RADL = 19; @@ -61,6 +65,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private @C.BufferFlags int bufferFlags; private long firstReceivedTimestamp; private int previousSequenceNumber; + /** The combined size of a sample that is fragmented into multiple RTP packets. */ private int fragmentedSampleSizeBytes; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpMp4aReader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpMp4aReader.java index 28886f2024..f294d8f6dd 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpMp4aReader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpMp4aReader.java @@ -52,6 +52,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private @MonotonicNonNull TrackOutput trackOutput; private long firstReceivedTimestamp; private int previousSequenceNumber; + /** The combined size of a sample that is fragmented into multiple subFrames. */ private int fragmentedSampleSizeBytes; diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpVp8Reader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpVp8Reader.java index a167e6f205..8c9c782ee0 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpVp8Reader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpVp8Reader.java @@ -51,12 +51,14 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private long firstReceivedTimestamp; private int previousSequenceNumber; + /** The combined size of a sample that is fragmented into multiple RTP packets. */ private int fragmentedSampleSizeBytes; private long fragmentedSampleTimeUs; private long startTimeOffsetUs; + /** * Whether the first packet of one VP8 frame is received. A VP8 frame can be split into two RTP * packets. diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpVp9Reader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpVp9Reader.java index 172588afb5..fc91741821 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpVp9Reader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpVp9Reader.java @@ -55,6 +55,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private long startTimeOffsetUs; private int previousSequenceNumber; + /** The combined size of a sample that is fragmented into multiple RTP packets. */ private int fragmentedSampleSizeBytes; @@ -62,6 +63,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private int width; private int height; + /** * Whether the first packet of a VP9 frame is received, it mark the start of a VP9 partition. A * VP9 frame can be split into multiple RTP packets. diff --git a/libraries/exoplayer_rtsp/src/test/java/androidx/media3/exoplayer/rtsp/RtpPacketStreamDump.java b/libraries/exoplayer_rtsp/src/test/java/androidx/media3/exoplayer/rtsp/RtpPacketStreamDump.java index 5371b80015..44ebde3f47 100644 --- a/libraries/exoplayer_rtsp/src/test/java/androidx/media3/exoplayer/rtsp/RtpPacketStreamDump.java +++ b/libraries/exoplayer_rtsp/src/test/java/androidx/media3/exoplayer/rtsp/RtpPacketStreamDump.java @@ -27,14 +27,19 @@ import org.json.JSONObject; /* package */ class RtpPacketStreamDump { /** The name of the RTP track. */ public final String trackName; + /** The sequence number of the first RTP packet in the dump file. */ public final int firstSequenceNumber; + /** The timestamp of the first RTP packet in the dump file. */ public final long firstTimestamp; + /** The interval between transmitting two consecutive RTP packets, in milliseconds. */ public final long transmissionIntervalMs; + /** The description of the dumped media in SDP(RFC2327) format. */ public final String mediaDescription; + /** A list of hex strings. Each hex string represents a binary RTP packet. */ public final ImmutableList packets; diff --git a/libraries/exoplayer_rtsp/src/test/java/androidx/media3/exoplayer/rtsp/RtspServer.java b/libraries/exoplayer_rtsp/src/test/java/androidx/media3/exoplayer/rtsp/RtspServer.java index 7ba284121f..34a03fbf18 100644 --- a/libraries/exoplayer_rtsp/src/test/java/androidx/media3/exoplayer/rtsp/RtspServer.java +++ b/libraries/exoplayer_rtsp/src/test/java/androidx/media3/exoplayer/rtsp/RtspServer.java @@ -66,6 +66,7 @@ public final class RtspServer implements Closeable { } private final Thread listenerThread; + /** Runs on the thread on which the constructor was called. */ private final Handler mainHandler; diff --git a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java index 7b81f7e50f..ac4aa92760 100644 --- a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java +++ b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java @@ -326,6 +326,7 @@ public final class SsMediaSource extends BaseMediaSource /** The minimum period between manifest refreshes. */ private static final int MINIMUM_MANIFEST_REFRESH_PERIOD_MS = 5000; + /** * The minimum default start position for live streams, relative to the start of the live window. */ diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/AacUtil.java b/libraries/extractor/src/main/java/androidx/media3/extractor/AacUtil.java index 82f561561b..85309bbce7 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/AacUtil.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/AacUtil.java @@ -39,8 +39,10 @@ public final class AacUtil { /** The sample rate in Hertz. */ public final int sampleRateHz; + /** The number of channels. */ public final int channelCount; + /** The RFC 6381 codecs string. */ public final String codecs; @@ -56,14 +58,17 @@ public final class AacUtil { * Number of raw audio samples that are produced per channel when decoding an AAC LC access unit. */ public static final int AAC_LC_AUDIO_SAMPLE_COUNT = 1024; + /** * Number of raw audio samples that are produced per channel when decoding an AAC XHE access unit. */ public static final int AAC_XHE_AUDIO_SAMPLE_COUNT = AAC_LC_AUDIO_SAMPLE_COUNT; + /** * Number of raw audio samples that are produced per channel when decoding an AAC HE access unit. */ public static final int AAC_HE_AUDIO_SAMPLE_COUNT = 2048; + /** * Number of raw audio samples that are produced per channel when decoding an AAC LD access unit. */ @@ -73,10 +78,13 @@ public final class AacUtil { // https://cs.android.com/android/platform/superproject/+/android-9.0.0_r8:external/aac/libAACenc/include/aacenc_lib.h;l=718 /** Maximum rate for an AAC LC audio stream, in bytes per second. */ public static final int AAC_LC_MAX_RATE_BYTES_PER_SECOND = 800 * 1000 / 8; + /** Maximum rate for an AAC HE V1 audio stream, in bytes per second. */ public static final int AAC_HE_V1_MAX_RATE_BYTES_PER_SECOND = 128 * 1000 / 8; + /** Maximum rate for an AAC HE V2 audio stream, in bytes per second. */ public static final int AAC_HE_V2_MAX_RATE_BYTES_PER_SECOND = 56 * 1000 / 8; + /** * Maximum rate for an AAC XHE audio stream, in bytes per second. * @@ -84,6 +92,7 @@ public final class AacUtil { * above the 500 kbit/s level. */ public static final int AAC_XHE_MAX_RATE_BYTES_PER_SECOND = 2048 * 1000 / 8; + /** * Maximum rate for an AAC ELD audio stream, in bytes per second. * @@ -97,6 +106,7 @@ public final class AacUtil { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350 }; private static final int AUDIO_SPECIFIC_CONFIG_CHANNEL_CONFIGURATION_INVALID = -1; + /** * In the channel configurations below, <A> indicates a single channel element; (A, B) * indicates a channel pair element; and [A] indicates a low-frequency effects element. The diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/Ac3Util.java b/libraries/extractor/src/main/java/androidx/media3/extractor/Ac3Util.java index 439e76df4b..5d4b176393 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/Ac3Util.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/Ac3Util.java @@ -53,12 +53,16 @@ public final class Ac3Util { @Target(TYPE_USE) @IntDef({STREAM_TYPE_UNDEFINED, STREAM_TYPE_TYPE0, STREAM_TYPE_TYPE1, STREAM_TYPE_TYPE2}) public @interface StreamType {} + /** Undefined AC3 stream type. */ public static final int STREAM_TYPE_UNDEFINED = -1; + /** Type 0 AC3 stream type. */ public static final int STREAM_TYPE_TYPE0 = 0; + /** Type 1 AC3 stream type. */ public static final int STREAM_TYPE_TYPE1 = 1; + /** Type 2 AC3 stream type. */ public static final int STREAM_TYPE_TYPE2 = 2; @@ -67,19 +71,25 @@ public final class Ac3Util { * MimeTypes#AUDIO_E_AC3}. */ @Nullable public final String mimeType; + /** * The type of the stream if {@link #mimeType} is {@link MimeTypes#AUDIO_E_AC3}, or {@link * #STREAM_TYPE_UNDEFINED} otherwise. */ public final @StreamType int streamType; + /** The audio sampling rate in Hz. */ public final int sampleRate; + /** The number of audio channels */ public final int channelCount; + /** The size of the frame. */ public final int frameSize; + /** Number of audio samples in the frame. */ public final int sampleCount; + /** The bitrate of audio samples. */ public final int bitrate; @@ -103,8 +113,10 @@ public final class Ac3Util { /** Maximum rate for an AC-3 audio stream, in bytes per second. */ public static final int AC3_MAX_RATE_BYTES_PER_SECOND = 640 * 1000 / 8; + /** Maximum rate for an E-AC-3 audio stream, in bytes per second. */ public static final int E_AC3_MAX_RATE_BYTES_PER_SECOND = 6144 * 1000 / 8; + /** Maximum rate for a TrueHD audio stream, in bytes per second. */ public static final int TRUEHD_MAX_RATE_BYTES_PER_SECOND = 24500 * 1000 / 8; @@ -114,6 +126,7 @@ public final class Ac3Util { * multiple of this value. */ public static final int TRUEHD_RECHUNK_SAMPLE_COUNT = 16; + /** * The number of bytes that must be parsed from a TrueHD syncframe to calculate the sample count. */ @@ -121,21 +134,28 @@ public final class Ac3Util { /** The number of new samples per (E-)AC-3 audio block. */ private static final int AUDIO_SAMPLES_PER_AUDIO_BLOCK = 256; + /** Each syncframe has 6 blocks that provide 256 new audio samples. See subsection 4.1. */ private static final int AC3_SYNCFRAME_AUDIO_SAMPLE_COUNT = 6 * AUDIO_SAMPLES_PER_AUDIO_BLOCK; + /** Number of audio blocks per E-AC-3 syncframe, indexed by numblkscod. */ private static final int[] BLOCKS_PER_SYNCFRAME_BY_NUMBLKSCOD = new int[] {1, 2, 3, 6}; + /** Sample rates, indexed by fscod. */ private static final int[] SAMPLE_RATE_BY_FSCOD = new int[] {48000, 44100, 32000}; + /** Sample rates, indexed by fscod2 (E-AC-3). */ private static final int[] SAMPLE_RATE_BY_FSCOD2 = new int[] {24000, 22050, 16000}; + /** Channel counts, indexed by acmod. */ private static final int[] CHANNEL_COUNT_BY_ACMOD = new int[] {2, 1, 2, 3, 3, 4, 4, 5}; + /** Nominal bitrates in kbps, indexed by frmsizecod / 2. (See table 4.13.) */ private static final int[] BITRATE_BY_HALF_FRMSIZECOD = new int[] { 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640 }; + /** 16-bit words per syncframe, indexed by frmsizecod / 2. (See table 4.13.) */ private static final int[] SYNCFRAME_SIZE_WORDS_BY_HALF_FRMSIZECOD_44_1 = new int[] { diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/Ac4Util.java b/libraries/extractor/src/main/java/androidx/media3/extractor/Ac4Util.java index 46513ba7b8..3386f73b41 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/Ac4Util.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/Ac4Util.java @@ -34,12 +34,16 @@ public final class Ac4Util { /** The bitstream version. */ public final int bitstreamVersion; + /** The audio sampling rate in Hz. */ public final int sampleRate; + /** The number of audio channels */ public final int channelCount; + /** The size of the frame. */ public final int frameSize; + /** Number of audio samples in the frame. */ public final int sampleCount; @@ -62,16 +66,19 @@ public final class Ac4Util { /** The channel count of AC-4 stream. */ // TODO: Parse AC-4 stream channel count. private static final int CHANNEL_COUNT_2 = 2; + /** * The AC-4 sync frame header size for extractor. The seven bytes are 0xAC, 0x40, 0xFF, 0xFF, * sizeByte1, sizeByte2, sizeByte3. See ETSI TS 103 190-1 V1.3.1, Annex G */ public static final int SAMPLE_HEADER_SIZE = 7; + /** * The header size for AC-4 parser. Only needs to be as big as we need to read, not the full * header size. */ public static final int HEADER_SIZE_FOR_PARSER = 16; + /** * Number of audio samples in the frame. Defined in IEC61937-14:2017 table 5 and 6. This table * provides the number of samples per frame at the playback sampling frequency of 48 kHz. For 44.1 diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/BinarySearchSeeker.java b/libraries/extractor/src/main/java/androidx/media3/extractor/BinarySearchSeeker.java index 61c8ac6b78..d28b3d1b20 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/BinarySearchSeeker.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/BinarySearchSeeker.java @@ -401,10 +401,13 @@ public abstract class BinarySearchSeeker { /** The search found a timestamp that it deems close enough to the given target. */ public static final int TYPE_TARGET_TIMESTAMP_FOUND = 0; + /** The search found only timestamps larger than the target timestamp. */ public static final int TYPE_POSITION_OVERESTIMATED = -1; + /** The search found only timestamps smaller than the target timestamp. */ public static final int TYPE_POSITION_UNDERESTIMATED = -2; + /** The search didn't find any timestamps. */ public static final int TYPE_NO_TIMESTAMP = -3; @@ -432,6 +435,7 @@ public abstract class BinarySearchSeeker { * SeekOperationParams#floorTimePosition} should be updated with this value. */ private final long timestampToUpdate; + /** * When {@link #type} is {@link #TYPE_POSITION_OVERESTIMATED}, the {@link * SeekOperationParams#ceilingBytePosition} should be updated with this value. When {@link diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/DolbyVisionConfig.java b/libraries/extractor/src/main/java/androidx/media3/extractor/DolbyVisionConfig.java index 80fa63c74b..620ce8fa78 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/DolbyVisionConfig.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/DolbyVisionConfig.java @@ -53,8 +53,10 @@ public final class DolbyVisionConfig { /** The profile number. */ public final int profile; + /** The level number. */ public final int level; + /** The RFC 6381 codecs string. */ public final String codecs; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/DtsUtil.java b/libraries/extractor/src/main/java/androidx/media3/extractor/DtsUtil.java index 19f870d84f..8e91119a59 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/DtsUtil.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/DtsUtil.java @@ -34,6 +34,7 @@ public final class DtsUtil { *

DTS allows an 'open' bitrate, but we assume the maximum listed value: 1536 kbit/s. */ public static final int DTS_MAX_RATE_BYTES_PER_SECOND = 1536 * 1000 / 8; + /** Maximum rate for a DTS-HD audio stream, in bytes per second. */ public static final int DTS_HD_MAX_RATE_BYTES_PER_SECOND = 18000 * 1000 / 8; @@ -41,11 +42,13 @@ public final class DtsUtil { private static final int SYNC_VALUE_14B_BE = 0x1FFFE800; private static final int SYNC_VALUE_LE = 0xFE7F0180; private static final int SYNC_VALUE_14B_LE = 0xFF1F00E8; + /** * DTS Extension Substream Syncword (in different Endianness). See ETSI TS 102 114 (V1.6.1) * Section 7.4.1. */ private static final int SYNC_EXT_SUB_LE = 0x25205864; + /** * DTS FTOC Sync words (in different Endianness). See ETSI TS 103 491 (V1.2.1) Section 6.4.4.1. */ diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/Extractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/Extractor.java index 02e8275f6f..aa89ba46c6 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/Extractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/Extractor.java @@ -36,12 +36,14 @@ public interface Extractor { * continuing from the position in the stream reached by the returning call. */ int RESULT_CONTINUE = 0; + /** * Returned by {@link #read(ExtractorInput, PositionHolder)} if the {@link ExtractorInput} passed * to the next {@link #read(ExtractorInput, PositionHolder)} is required to provide data starting * from a specified position in the stream. */ int RESULT_SEEK = 1; + /** * Returned by {@link #read(ExtractorInput, PositionHolder)} if the end of the {@link * ExtractorInput} was reached. Equal to {@link C#RESULT_END_OF_INPUT}. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/FlacStreamMetadata.java b/libraries/extractor/src/main/java/androidx/media3/extractor/FlacStreamMetadata.java index 7c2a9712ce..bf85418310 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/FlacStreamMetadata.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/FlacStreamMetadata.java @@ -53,6 +53,7 @@ public final class FlacStreamMetadata { public static class SeekTable { /** Seek points sample numbers. */ public final long[] pointSampleNumbers; + /** Seek points byte offsets from the first frame. */ public final long[] pointOffsets; @@ -69,14 +70,19 @@ public final class FlacStreamMetadata { /** Minimum number of samples per block. */ public final int minBlockSizeSamples; + /** Maximum number of samples per block. */ public final int maxBlockSizeSamples; + /** Minimum frame size in bytes, or 0 if the value is unknown. */ public final int minFrameSize; + /** Maximum frame size in bytes, or 0 if the value is unknown. */ public final int maxFrameSize; + /** Sample rate in Hertz. */ public final int sampleRate; + /** * Lookup key corresponding to the stream sample rate, or {@link #NOT_IN_LOOKUP_TABLE} if it is * not in the lookup table. @@ -86,10 +92,13 @@ public final class FlacStreamMetadata { *

The sample rate lookup table is described in https://xiph.org/flac/format.html#frame_header. */ public final int sampleRateLookupKey; + /** Number of audio channels. */ public final int channels; + /** Number of bits per sample. */ public final int bitsPerSample; + /** * Lookup key corresponding to the number of bits per sample of the stream, or {@link * #NOT_IN_LOOKUP_TABLE} if it is not in the lookup table. @@ -100,10 +109,13 @@ public final class FlacStreamMetadata { *

The sample size lookup table is described in https://xiph.org/flac/format.html#frame_header. */ public final int bitsPerSampleLookupKey; + /** Total number of samples, or 0 if the value is unknown. */ public final long totalSamples; + /** Seek table, or {@code null} if it is not provided. */ @Nullable public final SeekTable seekTable; + /** Content metadata, or {@code null} if it is not provided. */ @Nullable private final Metadata metadata; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/MpegAudioUtil.java b/libraries/extractor/src/main/java/androidx/media3/extractor/MpegAudioUtil.java index 8c362cee49..f8fa5c99e1 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/MpegAudioUtil.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/MpegAudioUtil.java @@ -29,16 +29,22 @@ public final class MpegAudioUtil { /** MPEG audio header version. */ public int version; + /** The MIME type. */ @Nullable public String mimeType; + /** Size of the frame associated with this header, in bytes. */ public int frameSize; + /** Sample rate in samples per second. */ public int sampleRate; + /** Number of audio channels in the frame. */ public int channels; + /** Bitrate of the frame in bit/s. */ public int bitrate; + /** Number of samples stored in the frame. */ public int samplesPerFrame; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/SeekMap.java b/libraries/extractor/src/main/java/androidx/media3/extractor/SeekMap.java index 037f8d7cb9..bd35d0e29f 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/SeekMap.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/SeekMap.java @@ -72,6 +72,7 @@ public interface SeekMap { /** The first seek point. */ public final SeekPoint first; + /** The second seek point, or {@link #first} if there's only one seek point. */ public final SeekPoint second; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/TrackOutput.java b/libraries/extractor/src/main/java/androidx/media3/extractor/TrackOutput.java index e479c27aac..5bbc9f2f09 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/TrackOutput.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/TrackOutput.java @@ -104,6 +104,7 @@ public interface TrackOutput { /** Main media sample data. */ int SAMPLE_DATA_PART_MAIN = 0; + /** * Sample encryption data. * @@ -128,6 +129,7 @@ public interface TrackOutput { * */ int SAMPLE_DATA_PART_ENCRYPTION = 1; + /** * Sample supplemental data. * diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/VorbisUtil.java b/libraries/extractor/src/main/java/androidx/media3/extractor/VorbisUtil.java index eedcb30185..946ff1e393 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/VorbisUtil.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/VorbisUtil.java @@ -59,22 +59,31 @@ public final class VorbisUtil { /** The {@code vorbis_version} field. */ public final int version; + /** The {@code audio_channels} field. */ public final int channels; + /** The {@code audio_sample_rate} field. */ public final int sampleRate; + /** The {@code bitrate_maximum} field, or {@link Format#NO_VALUE} if not greater than zero. */ public final int bitrateMaximum; + /** The {@code bitrate_nominal} field, or {@link Format#NO_VALUE} if not greater than zero. */ public final int bitrateNominal; + /** The {@code bitrate_minimum} field, or {@link Format#NO_VALUE} if not greater than zero. */ public final int bitrateMinimum; + /** The {@code blocksize_0} field. */ public final int blockSize0; + /** The {@code blocksize_1} field. */ public final int blockSize1; + /** The {@code framing_flag} field. */ public final boolean framingFlag; + /** The raw header data. */ public final byte[] data; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/WavUtil.java b/libraries/extractor/src/main/java/androidx/media3/extractor/WavUtil.java index 6b45d5d97d..2b7eeaeae9 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/WavUtil.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/WavUtil.java @@ -26,27 +26,37 @@ public final class WavUtil { /** Four character code for "RIFF". */ public static final int RIFF_FOURCC = 0x52494646; + /** Four character code for "WAVE". */ public static final int WAVE_FOURCC = 0x57415645; + /** Four character code for "fmt ". */ public static final int FMT_FOURCC = 0x666d7420; + /** Four character code for "data". */ public static final int DATA_FOURCC = 0x64617461; + /** Four character code for "RF64". */ public static final int RF64_FOURCC = 0x52463634; + /** Four character code for "ds64". */ public static final int DS64_FOURCC = 0x64733634; /** WAVE type value for integer PCM audio data. */ public static final int TYPE_PCM = 0x0001; + /** WAVE type value for float PCM audio data. */ public static final int TYPE_FLOAT = 0x0003; + /** WAVE type value for 8-bit ITU-T G.711 A-law audio data. */ public static final int TYPE_ALAW = 0x0006; + /** WAVE type value for 8-bit ITU-T G.711 mu-law audio data. */ public static final int TYPE_MLAW = 0x0007; + /** WAVE type value for IMA ADPCM audio data. */ public static final int TYPE_IMA_ADPCM = 0x0011; + /** WAVE type value for extended WAVE format. */ public static final int TYPE_WAVE_FORMAT_EXTENSIBLE = 0xFFFE; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/amr/AmrExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/amr/AmrExtractor.java index 3597a8ad50..2260a55a8e 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/amr/AmrExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/amr/AmrExtractor.java @@ -70,11 +70,13 @@ public final class AmrExtractor implements Extractor { flag = true, value = {FLAG_ENABLE_CONSTANT_BITRATE_SEEKING, FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS}) public @interface Flags {} + /** * Flag to force enable seeking using a constant bitrate assumption in cases where seeking would * otherwise not be possible. */ public static final int FLAG_ENABLE_CONSTANT_BITRATE_SEEKING = 1; + /** * Like {@link #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING}, except that seeking is also enabled in * cases where the content length (and hence the duration of the media) is unknown. Application @@ -139,6 +141,7 @@ public final class AmrExtractor implements Extractor { /** Theoretical maximum frame size for a AMR frame. */ private static final int MAX_FRAME_SIZE_BYTES = frameSizeBytesByTypeWb[8]; + /** * The required number of samples in the stream with same sample size to classify the stream as a * constant-bitrate-stream. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/avi/ChunkReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/avi/ChunkReader.java index 4f788429ce..7ad8197a9b 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/avi/ChunkReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/avi/ChunkReader.java @@ -55,6 +55,7 @@ import java.util.Arrays; /** The chunk id fourCC (example: `01wb`), as defined in the index and the movi. */ private final int chunkId; + /** Secondary chunk id. Bad muxers sometimes use an uncompressed video id (db) for key frames */ private final int alternativeChunkId; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/flac/FlacConstants.java b/libraries/extractor/src/main/java/androidx/media3/extractor/flac/FlacConstants.java index a82453f3d1..212ee37627 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/flac/FlacConstants.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/flac/FlacConstants.java @@ -23,21 +23,28 @@ public final class FlacConstants { /** Size of the FLAC stream marker in bytes. */ public static final int STREAM_MARKER_SIZE = 4; + /** Size of the header of a FLAC metadata block in bytes. */ public static final int METADATA_BLOCK_HEADER_SIZE = 4; + /** Size of the FLAC stream info block (header included) in bytes. */ public static final int STREAM_INFO_BLOCK_SIZE = 38; + /** Minimum size of a FLAC frame header in bytes. */ public static final int MIN_FRAME_HEADER_SIZE = 6; + /** Maximum size of a FLAC frame header in bytes. */ public static final int MAX_FRAME_HEADER_SIZE = 16; /** Stream info metadata block type. */ public static final int METADATA_TYPE_STREAM_INFO = 0; + /** Seek table metadata block type. */ public static final int METADATA_TYPE_SEEK_TABLE = 3; + /** Vorbis comment metadata block type. */ public static final int METADATA_TYPE_VORBIS_COMMENT = 4; + /** Picture metadata block type. */ public static final int METADATA_TYPE_PICTURE = 6; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/jpeg/MotionPhotoDescription.java b/libraries/extractor/src/main/java/androidx/media3/extractor/jpeg/MotionPhotoDescription.java index f3715c8bee..d35447b0cb 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/jpeg/MotionPhotoDescription.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/jpeg/MotionPhotoDescription.java @@ -28,13 +28,16 @@ import java.util.List; public static final class ContainerItem { /** The MIME type of the media item. */ public final String mime; + /** The application-specific meaning of the media item. */ public final String semantic; + /** * The positive integer length in bytes of the media item, or 0 for primary media items and * secondary media items that share their resource with the preceding media item. */ public final long length; + /** * The number of bytes of additional padding between the end of the primary media item and the * start of the next media item. 0 for secondary media items. @@ -54,6 +57,7 @@ import java.util.List; * if unknown. */ public final long photoPresentationTimestampUs; + /** * The media items represented by the motion photo file, in order. The primary media item is * listed first, followed by any secondary media items. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/dvbsi/AppInfoTable.java b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/dvbsi/AppInfoTable.java index ebbe7a712c..2374e42709 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/dvbsi/AppInfoTable.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/dvbsi/AppInfoTable.java @@ -35,6 +35,7 @@ public final class AppInfoTable implements Metadata.Entry { * already running. */ public static final int CONTROL_CODE_AUTOSTART = 0x01; + /** * The application is allowed to run while the service is selected, however it shall not start * automatically when the service becomes selected. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/dvbsi/AppInfoTableDecoder.java b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/dvbsi/AppInfoTableDecoder.java index b5b086a724..50be1d77e5 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/dvbsi/AppInfoTableDecoder.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/dvbsi/AppInfoTableDecoder.java @@ -37,6 +37,7 @@ public final class AppInfoTableDecoder extends SimpleMetadataDecoder { /** See section 5.3.6. */ private static final int DESCRIPTOR_TRANSPORT_PROTOCOL = 0x02; + /** See section 5.3.7. */ private static final int DESCRIPTOR_SIMPLE_APPLICATION_LOCATION = 0x15; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/flac/PictureFrame.java b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/flac/PictureFrame.java index 4dd72f135a..6189212518 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/flac/PictureFrame.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/flac/PictureFrame.java @@ -33,18 +33,25 @@ public final class PictureFrame implements Metadata.Entry { /** The type of the picture. */ public final int pictureType; + /** The MIME type of the picture. */ public final String mimeType; + /** A description of the picture. */ public final String description; + /** The width of the picture in pixels. */ public final int width; + /** The height of the picture in pixels. */ public final int height; + /** The color depth of the picture in bits-per-pixel. */ public final int depth; + /** For indexed-color pictures (e.g. GIF), the number of colors used. 0 otherwise. */ public final int colors; + /** The encoded picture data. */ public final byte[] pictureData; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/icy/IcyHeaders.java b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/icy/IcyHeaders.java index 84dc021c3e..a3cd64698d 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/icy/IcyHeaders.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/icy/IcyHeaders.java @@ -121,12 +121,16 @@ public final class IcyHeaders implements Metadata.Entry { * was not present. */ public final int bitrate; + /** The genre ({@code icy-genre}). */ @Nullable public final String genre; + /** The stream name ({@code icy-name}). */ @Nullable public final String name; + /** The URL of the radio station ({@code icy-url}). */ @Nullable public final String url; + /** * Whether the radio station is listed ({@code icy-pub}), or {@code false} if the header was not * present. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/icy/IcyInfo.java b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/icy/IcyInfo.java index 8c44790348..1a18e74ccf 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/icy/IcyInfo.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/icy/IcyInfo.java @@ -30,8 +30,10 @@ public final class IcyInfo implements Metadata.Entry { /** The complete metadata bytes used to construct this IcyInfo. */ public final byte[] rawMetadata; + /** The stream title if present and decodable, or {@code null}. */ @Nullable public final String title; + /** The stream URL if present and decodable, or {@code null}. */ @Nullable public final String url; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/ChapterFrame.java b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/ChapterFrame.java index 93f73f10ad..4f5c88b6d3 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/ChapterFrame.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/ChapterFrame.java @@ -33,8 +33,10 @@ public final class ChapterFrame extends Id3Frame { public final String chapterId; public final int startTimeMs; public final int endTimeMs; + /** The byte offset of the start of the chapter, or {@link C#INDEX_UNSET} if not set. */ public final long startOffset; + /** The byte offset of the end of the chapter, or {@link C#INDEX_UNSET} if not set. */ public final long endOffset; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/Id3Decoder.java b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/Id3Decoder.java index 45beb7f641..3358fe0daf 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/Id3Decoder.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/Id3Decoder.java @@ -63,6 +63,7 @@ public final class Id3Decoder extends SimpleMetadataDecoder { /** The first three bytes of a well formed ID3 tag header. */ public static final int ID3_TAG = 0x00494433; + /** Length of an ID3 tag header. */ public static final int ID3_HEADER_LENGTH = 10; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/PrivFrame.java b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/PrivFrame.java index 155003045e..cbdcaeae32 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/PrivFrame.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/PrivFrame.java @@ -69,6 +69,7 @@ public final class PrivFrame extends Id3Frame { public String toString() { return id + ": owner=" + owner; } + // Parcelable implementation. @Override diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/mp4/MotionPhotoMetadata.java b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/mp4/MotionPhotoMetadata.java index 849554a8cf..fd7deb72bb 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/mp4/MotionPhotoMetadata.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/mp4/MotionPhotoMetadata.java @@ -30,14 +30,18 @@ public final class MotionPhotoMetadata implements Metadata.Entry { /** The start offset of the photo data, in bytes. */ public final long photoStartPosition; + /** The size of the photo data, in bytes. */ public final long photoSize; + /** * The presentation timestamp of the photo, in microseconds, or {@link C#TIME_UNSET} if unknown. */ public final long photoPresentationTimestampUs; + /** The start offset of the video data, in bytes. */ public final long videoStartPosition; + /** The size of the video data, in bytes. */ public final long videoSize; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/mp4/SlowMotionData.java b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/mp4/SlowMotionData.java index d496bf3b38..a48b7c2090 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/mp4/SlowMotionData.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/mp4/SlowMotionData.java @@ -46,8 +46,10 @@ public final class SlowMotionData implements Metadata.Entry { /** The start time, in milliseconds, of the track segment that is intended to be slow motion. */ public final long startTimeMs; + /** The end time, in milliseconds, of the track segment that is intended to be slow motion. */ public final long endTimeMs; + /** * The speed reduction factor. * diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/mp4/SmtaMetadataEntry.java b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/mp4/SmtaMetadataEntry.java index c399a1abf7..f0a747f3c2 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/mp4/SmtaMetadataEntry.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/mp4/SmtaMetadataEntry.java @@ -37,6 +37,7 @@ public final class SmtaMetadataEntry implements Metadata.Entry { *

If known, the capture frame rate should always be an integer value. */ public final float captureFrameRate; + /** The number of layers in the SVC extended frames. */ public final int svcTemporalLayerCount; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/PrivateCommand.java b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/PrivateCommand.java index 53e0f372b1..d867f3c4a5 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/PrivateCommand.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/PrivateCommand.java @@ -27,8 +27,10 @@ public final class PrivateCommand extends SpliceCommand { /** The {@code pts_adjustment} as defined in SCTE35, Section 9.2. */ public final long ptsAdjustment; + /** The identifier as defined in SCTE35, Section 9.3.6. */ public final long identifier; + /** The private bytes as defined in SCTE35, Section 9.3.6. */ public final byte[] commandBytes; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/SpliceInsertCommand.java b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/SpliceInsertCommand.java index 2ba778f805..79c2bb9748 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/SpliceInsertCommand.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/SpliceInsertCommand.java @@ -31,50 +31,62 @@ public final class SpliceInsertCommand extends SpliceCommand { /** The splice event id. */ public final long spliceEventId; + /** True if the event with id {@link #spliceEventId} has been canceled. */ public final boolean spliceEventCancelIndicator; + /** * If true, the splice event is an opportunity to exit from the network feed. If false, indicates * an opportunity to return to the network feed. */ public final boolean outOfNetworkIndicator; + /** * Whether the splice mode is program splice mode, whereby all PIDs/components are to be spliced. * If false, splicing is done per PID/component. */ public final boolean programSpliceFlag; + /** * Whether splicing should be done at the nearest opportunity. If false, splicing should be done * at the moment indicated by {@link #programSplicePlaybackPositionUs} or {@link * ComponentSplice#componentSplicePlaybackPositionUs}, depending on {@link #programSpliceFlag}. */ public final boolean spliceImmediateFlag; + /** * If {@link #programSpliceFlag} is true, the PTS at which the program splice should occur. {@link * C#TIME_UNSET} otherwise. */ public final long programSplicePts; + /** Equivalent to {@link #programSplicePts} but in the playback timebase. */ public final long programSplicePlaybackPositionUs; + /** * If {@link #programSpliceFlag} is false, a non-empty list containing the {@link * ComponentSplice}s. Otherwise, an empty list. */ public final List componentSpliceList; + /** * If {@link #breakDurationUs} is not {@link C#TIME_UNSET}, defines whether {@link * #breakDurationUs} should be used to know when to return to the network feed. If {@link * #breakDurationUs} is {@link C#TIME_UNSET}, the value is undefined. */ public final boolean autoReturn; + /** * The duration of the splice in microseconds, or {@link C#TIME_UNSET} if no duration is present. */ public final long breakDurationUs; + /** The unique program id as defined in SCTE35, Section 9.3.3. */ public final int uniqueProgramId; + /** Holds the value of {@code avail_num} as defined in SCTE35, Section 9.3.3. */ public final int availNum; + /** Holds the value of {@code avails_expected} as defined in SCTE35, Section 9.3.3. */ public final int availsExpected; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/SpliceScheduleCommand.java b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/SpliceScheduleCommand.java index d7c086e7c2..a751cd9975 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/SpliceScheduleCommand.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/SpliceScheduleCommand.java @@ -33,43 +33,53 @@ public final class SpliceScheduleCommand extends SpliceCommand { /** The splice event id. */ public final long spliceEventId; + /** True if the event with id {@link #spliceEventId} has been canceled. */ public final boolean spliceEventCancelIndicator; + /** * If true, the splice event is an opportunity to exit from the network feed. If false, * indicates an opportunity to return to the network feed. */ public final boolean outOfNetworkIndicator; + /** * Whether the splice mode is program splice mode, whereby all PIDs/components are to be * spliced. If false, splicing is done per PID/component. */ public final boolean programSpliceFlag; + /** * Represents the time of the signaled splice event as the number of seconds since 00 hours UTC, * January 6th, 1980, with the count of intervening leap seconds included. */ public final long utcSpliceTime; + /** * If {@link #programSpliceFlag} is false, a non-empty list containing the {@link * ComponentSplice}s. Otherwise, an empty list. */ public final List componentSpliceList; + /** * If {@link #breakDurationUs} is not {@link C#TIME_UNSET}, defines whether {@link * #breakDurationUs} should be used to know when to return to the network feed. If {@link * #breakDurationUs} is {@link C#TIME_UNSET}, the value is undefined. */ public final boolean autoReturn; + /** * The duration of the splice in microseconds, or {@link C#TIME_UNSET} if no duration is * present. */ public final long breakDurationUs; + /** The unique program id as defined in SCTE35, Section 9.3.2. */ public final int uniqueProgramId; + /** Holds the value of {@code avail_num} as defined in SCTE35, Section 9.3.2. */ public final int availNum; + /** Holds the value of {@code avails_expected} as defined in SCTE35, Section 9.3.2. */ public final int availsExpected; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/TimeSignalCommand.java b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/TimeSignalCommand.java index ab52517a2e..e12f4cf138 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/TimeSignalCommand.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/TimeSignalCommand.java @@ -27,6 +27,7 @@ public final class TimeSignalCommand extends SpliceCommand { /** A PTS value, as defined in SCTE35, Section 9.3.4. */ public final long ptsTime; + /** Equivalent to {@link #ptsTime} but in the playback timebase. */ public final long playbackPositionUs; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mkv/EbmlProcessor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mkv/EbmlProcessor.java index 762e897d9d..18227d1cc9 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mkv/EbmlProcessor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mkv/EbmlProcessor.java @@ -48,16 +48,22 @@ public interface EbmlProcessor { ELEMENT_TYPE_FLOAT }) @interface ElementType {} + /** Type for unknown elements. */ int ELEMENT_TYPE_UNKNOWN = 0; + /** Type for elements that contain child elements. */ int ELEMENT_TYPE_MASTER = 1; + /** Type for integer value elements of up to 8 bytes. */ int ELEMENT_TYPE_UNSIGNED_INT = 2; + /** Type for string elements. */ int ELEMENT_TYPE_STRING = 3; + /** Type for binary elements. */ int ELEMENT_TYPE_BINARY = 4; + /** Type for IEEE floating point value elements of either 4 or 8 bytes. */ int ELEMENT_TYPE_FLOAT = 5; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mkv/MatroskaExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mkv/MatroskaExtractor.java index 9d2c4e6ce8..181d97a298 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mkv/MatroskaExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mkv/MatroskaExtractor.java @@ -94,6 +94,7 @@ public class MatroskaExtractor implements Extractor { flag = true, value = {FLAG_DISABLE_SEEK_FOR_CUES}) public @interface Flags {} + /** * Flag to disable seeking for cues. * @@ -258,6 +259,7 @@ public class MatroskaExtractor implements Extractor { * https://www.matroska.org/technical/codec_specs.html. */ private static final int BLOCK_ADD_ID_TYPE_DVCC = 0x64766343; + /** * BlockAddIdType value for Dolby Vision configuration with profile > 7. See also * https://www.matroska.org/technical/codec_specs.html. @@ -289,13 +291,16 @@ public class MatroskaExtractor implements Extractor { 49, 10, 48, 48, 58, 48, 48, 58, 48, 48, 44, 48, 48, 48, 32, 45, 45, 62, 32, 48, 48, 58, 48, 48, 58, 48, 48, 44, 48, 48, 48, 10 }; + /** The byte offset of the end timecode in {@link #SUBRIP_PREFIX}. */ private static final int SUBRIP_PREFIX_END_TIMECODE_OFFSET = 19; + /** * The value by which to divide a time in microseconds to convert it to the unit of the last value * in a subrip timecode (milliseconds). */ private static final long SUBRIP_TIMECODE_LAST_VALUE_SCALING_FACTOR = 1000; + /** The format of a subrip timecode. */ private static final String SUBRIP_TIMECODE_FORMAT = "%02d:%02d:%02d,%03d"; @@ -304,6 +309,7 @@ public class MatroskaExtractor implements Extractor { Util.getUtf8Bytes( "Format: Start, End, " + "ReadOrder, Layer, Style, Name, MarginL, MarginR, MarginV, Effect, Text"); + /** * A template for the prefix that must be added to each SSA sample. * @@ -320,13 +326,16 @@ public class MatroskaExtractor implements Extractor { 68, 105, 97, 108, 111, 103, 117, 101, 58, 32, 48, 58, 48, 48, 58, 48, 48, 58, 48, 48, 44, 48, 58, 48, 48, 58, 48, 48, 58, 48, 48, 44 }; + /** The byte offset of the end timecode in {@link #SSA_PREFIX}. */ private static final int SSA_PREFIX_END_TIMECODE_OFFSET = 21; + /** * The value by which to divide a time in microseconds to convert it to the unit of the last value * in an SSA timecode (1/100ths of a second). */ private static final long SSA_TIMECODE_LAST_VALUE_SCALING_FACTOR = 10_000; + /** The format of an SSA timecode. */ private static final String SSA_TIMECODE_FORMAT = "%01d:%02d:%02d:%02d"; @@ -346,22 +355,28 @@ public class MatroskaExtractor implements Extractor { 87, 69, 66, 86, 84, 84, 10, 10, 48, 48, 58, 48, 48, 58, 48, 48, 46, 48, 48, 48, 32, 45, 45, 62, 32, 48, 48, 58, 48, 48, 58, 48, 48, 46, 48, 48, 48, 10 }; + /** The byte offset of the end timecode in {@link #VTT_PREFIX}. */ private static final int VTT_PREFIX_END_TIMECODE_OFFSET = 25; + /** * The value by which to divide a time in microseconds to convert it to the unit of the last value * in a VTT timecode (milliseconds). */ private static final long VTT_TIMECODE_LAST_VALUE_SCALING_FACTOR = 1000; + /** The format of a VTT timecode. */ private static final String VTT_TIMECODE_FORMAT = "%02d:%02d:%02d.%03d"; /** The length in bytes of a WAVEFORMATEX structure. */ private static final int WAVE_FORMAT_SIZE = 18; + /** Format tag indicating a WAVEFORMATEXTENSIBLE structure. */ private static final int WAVE_FORMAT_EXTENSIBLE = 0xFFFE; + /** Format tag for PCM. */ private static final int WAVE_FORMAT_PCM = 1; + /** Sub format for PCM. */ private static final UUID WAVE_SUBFORMAT_PCM = new UUID(0x0100000000001000L, 0x800000AA00389B71L); @@ -1974,6 +1989,7 @@ public class MatroskaExtractor implements Extractor { private static final int DISPLAY_UNIT_PIXELS = 0; private static final int MAX_CHROMATICITY = 50_000; // Defined in CTA-861.3. + /** Default max content light level (CLL) that should be encoded into hdrStaticInfo. */ private static final int DEFAULT_MAX_CLL = 1000; // nits. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Mp3Extractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Mp3Extractor.java index e0817da35b..9ab3dc27ab 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Mp3Extractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Mp3Extractor.java @@ -78,6 +78,7 @@ public final class Mp3Extractor implements Extractor { FLAG_DISABLE_ID3_METADATA }) public @interface Flags {} + /** * Flag to force enable seeking using a constant bitrate assumption in cases where seeking would * otherwise not be possible. @@ -85,6 +86,7 @@ public final class Mp3Extractor implements Extractor { *

This flag is ignored if {@link #FLAG_ENABLE_INDEX_SEEKING} is set. */ public static final int FLAG_ENABLE_CONSTANT_BITRATE_SEEKING = 1; + /** * Like {@link #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING}, except that seeking is also enabled in * cases where the content length (and hence the duration of the media) is unknown. Application @@ -113,6 +115,7 @@ public final class Mp3Extractor implements Extractor { * */ public static final int FLAG_ENABLE_INDEX_SEEKING = 1 << 2; + /** * Flag to disable parsing of ID3 metadata. Can be set to save memory if ID3 metadata is not * required. @@ -127,10 +130,12 @@ public final class Mp3Extractor implements Extractor { /** The maximum number of bytes to search when synchronizing, before giving up. */ private static final int MAX_SYNC_BYTES = 128 * 1024; + /** * The maximum number of bytes to peek when sniffing, excluding the ID3 header, before giving up. */ private static final int MAX_SNIFF_BYTES = 32 * 1024; + /** Maximum length of data read into {@link #scratch}. */ private static final int SCRATCH_LENGTH = 10; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/XingSeeker.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/XingSeeker.java index 34c57babb8..1642e53367 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/XingSeeker.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/XingSeeker.java @@ -84,10 +84,12 @@ import androidx.media3.extractor.SeekPoint; private final long dataStartPosition; private final int xingFrameSize; private final long durationUs; + /** Data size, including the XING frame. */ private final long dataSize; private final long dataEndPosition; + /** * Entries are in the range [0, 255], but are stored as long integers for convenience. Null if the * table of contents was missing from the header, in which case seeking is not be supported. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomParsers.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomParsers.java index 22fdc3bd01..b1696cbbad 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomParsers.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomParsers.java @@ -736,7 +736,10 @@ import java.util.List; long ptsUs = Util.scaleLargeTimestamp(pts, C.MICROS_PER_SECOND, track.movieTimescale); long timeInSegmentUs = Util.scaleLargeTimestamp( - max(0, timestamps[j] - editMediaTime), C.MICROS_PER_SECOND, track.timescale); + timestamps[j] - editMediaTime, C.MICROS_PER_SECOND, track.timescale); + if (canTrimSamplesWithTimestampChange(track.type)) { + timeInSegmentUs = max(0, timeInSegmentUs); + } editedTimestamps[sampleIndex] = ptsUs + timeInSegmentUs; if (copyMetadata && editedSizes[sampleIndex] > editedMaximumSize) { editedMaximumSize = sizes[j]; @@ -757,6 +760,12 @@ import java.util.List; editedDurationUs); } + private static boolean canTrimSamplesWithTimestampChange(@C.TrackType int trackType) { + // Audio samples have an inherent duration and we can't trim data by changing the sample + // timestamp alone. + return trackType != C.TRACK_TYPE_AUDIO; + } + @Nullable private static Metadata parseUdtaMeta(ParsableByteArray meta, int limit) { meta.skipBytes(Atom.HEADER_SIZE); diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java index f4705aa934..9c56828a20 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java @@ -92,6 +92,7 @@ public class FragmentedMp4Extractor implements Extractor { FLAG_WORKAROUND_IGNORE_EDIT_LISTS }) public @interface Flags {} + /** * Flag to work around an issue in some video streams where every frame is marked as a sync frame. * The workaround overrides the sync frame flags in the stream, forcing them to false except for @@ -100,8 +101,10 @@ public class FragmentedMp4Extractor implements Extractor { *

This flag does nothing if the stream is not a video stream. */ public static final int FLAG_WORKAROUND_EVERY_VIDEO_FRAME_IS_SYNC_FRAME = 1; + /** Flag to ignore any tfdt boxes in the stream. */ public static final int FLAG_WORKAROUND_IGNORE_TFDT_BOX = 1 << 1; // 2 + /** * Flag to indicate that the extractor should output an event message metadata track. Any event * messages in the stream will be delivered as samples to this track. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Mp4Extractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Mp4Extractor.java index 469d9862c5..acf20076e9 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Mp4Extractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Mp4Extractor.java @@ -83,8 +83,10 @@ public final class Mp4Extractor implements Extractor, SeekMap { FLAG_READ_SEF_DATA }) public @interface Flags {} + /** Flag to ignore any edit lists in the stream. */ public static final int FLAG_WORKAROUND_IGNORE_EDIT_LISTS = 1; + /** * Flag to extract {@link MotionPhotoMetadata} from HEIC motion photos following the Google Photos * Motion Photo File Format V1.1. @@ -93,6 +95,7 @@ public final class Mp4Extractor implements Extractor, SeekMap { * retrieval use cases. */ public static final int FLAG_READ_MOTION_PHOTO_METADATA = 1 << 1; + /** * Flag to extract {@link SlowMotionData} metadata from Samsung Extension Format (SEF) slow motion * videos. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/SefReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/SefReader.java index b5161fbf1e..a45e3cca00 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/SefReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/SefReader.java @@ -87,8 +87,10 @@ import java.util.List; *

This is the last 4 bytes of a file that has Samsung Extension Format (SEF) data. */ private static final int SAMSUNG_TAIL_SIGNATURE = 0x53454654; + /** Start signature (4 bytes), SEF version (4 bytes), SDR count (4 bytes). */ private static final int TAIL_HEADER_LENGTH = 12; + /** Tail offset (4 bytes), tail signature (4 bytes). */ private static final int TAIL_FOOTER_LENGTH = 8; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Sniffer.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Sniffer.java index c52fa67a3e..7d486f55fb 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Sniffer.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Sniffer.java @@ -28,6 +28,7 @@ import java.io.IOException; /** Brand stored in the ftyp atom for QuickTime media. */ public static final int BRAND_QUICKTIME = 0x71742020; + /** Brand stored in the ftyp atom for HEIC media. */ public static final int BRAND_HEIC = 0x68656963; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Track.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Track.java index 5a15d5c4ed..ec32a0f767 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Track.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Track.java @@ -40,8 +40,10 @@ public final class Track { @Target(TYPE_USE) @IntDef({TRANSFORMATION_NONE, TRANSFORMATION_CEA608_CDAT}) public @interface Transformation {} + /** A no-op sample transformation. */ public static final int TRANSFORMATION_NONE = 0; + /** A transformation for caption samples in cdat atoms. */ public static final int TRANSFORMATION_CEA608_CDAT = 1; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/TrackFragment.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/TrackFragment.java index f5a70a1d6e..c4c6c58ca6 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/TrackFragment.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/TrackFragment.java @@ -26,48 +26,65 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** The default values for samples from the track fragment header. */ public @MonotonicNonNull DefaultSampleValues header; + /** The position (byte offset) of the start of fragment. */ public long atomPosition; + /** The position (byte offset) of the start of data contained in the fragment. */ public long dataPosition; + /** The position (byte offset) of the start of auxiliary data. */ public long auxiliaryDataPosition; + /** The number of track runs of the fragment. */ public int trunCount; + /** The total number of samples in the fragment. */ public int sampleCount; + /** The position (byte offset) of the start of sample data of each track run in the fragment. */ public long[] trunDataPosition; + /** The number of samples contained by each track run in the fragment. */ public int[] trunLength; + /** The size of each sample in the fragment. */ public int[] sampleSizeTable; + /** The presentation time of each sample in the fragment, in microseconds. */ public long[] samplePresentationTimesUs; + /** Indicates which samples are sync frames. */ public boolean[] sampleIsSyncFrameTable; + /** Whether the fragment defines encryption data. */ public boolean definesEncryptionData; + /** * If {@link #definesEncryptionData} is true, indicates which samples use sub-sample encryption. * Undefined otherwise. */ public boolean[] sampleHasSubsampleEncryptionTable; + /** Fragment specific track encryption. May be null. */ @Nullable public TrackEncryptionBox trackEncryptionBox; + /** * If {@link #definesEncryptionData} is true, contains binary sample encryption data. Undefined * otherwise. */ public final ParsableByteArray sampleEncryptionData; + /** Whether {@link #sampleEncryptionData} needs populating with the actual encryption data. */ public boolean sampleEncryptionDataNeedsFill; + /** * The duration of all the samples defined in the fragments up to and including this one, plus the * duration of the samples defined in the moov atom if {@link #nextFragmentDecodeTimeIncludesMoov} * is {@code true}. */ public long nextFragmentDecodeTime; + /** * Whether {@link #nextFragmentDecodeTime} includes the duration of the samples referred to by the * moov atom. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/TrackSampleTable.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/TrackSampleTable.java index 5472db9ae7..7f2c046865 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/TrackSampleTable.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/TrackSampleTable.java @@ -24,18 +24,25 @@ import androidx.media3.common.util.Util; /** The track corresponding to this sample table. */ public final Track track; + /** Number of samples. */ public final int sampleCount; + /** Sample offsets in bytes. */ public final long[] offsets; + /** Sample sizes in bytes. */ public final int[] sizes; + /** Maximum sample size in {@link #sizes}. */ public final int maximumSize; + /** Sample timestamps in microseconds. */ public final long[] timestampsUs; + /** Sample flags. */ public final int[] flags; + /** The duration of the track sample table in microseconds. */ public final long durationUs; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ogg/OggPageHeader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ogg/OggPageHeader.java index 9f6cfc52b3..23fba1678a 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ogg/OggPageHeader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ogg/OggPageHeader.java @@ -38,6 +38,7 @@ import java.io.IOException; public int revision; public int type; + /** * The absolute granule position of the page. This is the total number of samples from the start * of the file up to the end of the page. Samples partially in the page that continue on @@ -51,6 +52,7 @@ import java.io.IOException; public int pageSegmentCount; public int headerSize; public int bodySize; + /** * Be aware that {@code laces.length} is always {@link #MAX_SEGMENT_COUNT}. Instead use {@link * #pageSegmentCount} to iterate. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleExtractor.java index df43d16ae5..c74794a629 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleExtractor.java @@ -64,14 +64,19 @@ public class SubtitleExtractor implements Extractor { /** The extractor has been created. */ private static final int STATE_CREATED = 0; + /** The extractor has been initialized. */ private static final int STATE_INITIALIZED = 1; + /** The extractor is reading from the input and writing to the output. */ private static final int STATE_EXTRACTING = 2; + /** The extractor has received a seek() operation after it has already finished extracting. */ private static final int STATE_SEEKING = 3; + /** The extractor has finished extracting the input. */ private static final int STATE_FINISHED = 4; + /** The extractor has been released. */ private static final int STATE_RELEASED = 5; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/Cea608Decoder.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/Cea608Decoder.java index 7c54f93a4e..f5efdfd53b 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/Cea608Decoder.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/Cea608Decoder.java @@ -106,11 +106,13 @@ public final class Cea608Decoder extends CeaDecoder { * simultaneously. */ private static final byte CTRL_ROLL_UP_CAPTIONS_2_ROWS = 0x25; + /** * Command initiating roll-up style captioning, with the maximum of 3 rows displayed * simultaneously. */ private static final byte CTRL_ROLL_UP_CAPTIONS_3_ROWS = 0x26; + /** * Command initiating roll-up style captioning, with the maximum of 4 rows displayed * simultaneously. @@ -122,6 +124,7 @@ public final class Cea608Decoder extends CeaDecoder { * to displayed memory without need for the {@link #CTRL_RESUME_CAPTION_LOADING} command. */ private static final byte CTRL_RESUME_DIRECT_CAPTIONING = 0x29; + /** * TEXT commands are switching to TEXT service. All consecutive incoming data must be filtered out * until a command is received that switches back to the CAPTION service. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/Cea708Decoder.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/Cea708Decoder.java index a2e659478c..516a44a324 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/Cea708Decoder.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/Cea708Decoder.java @@ -147,6 +147,7 @@ public final class Cea708Decoder extends CeaDecoder { private final ParsableByteArray ccData; private final ParsableBitArray captionChannelPacketData; private int previousSequenceNumber; + // TODO: Use isWideAspectRatio in decoding. @SuppressWarnings({"unused", "FieldCanBeLocal"}) private final boolean isWideAspectRatio; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaDecoder.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaDecoder.java index 30017383e9..0067e68f65 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaDecoder.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaDecoder.java @@ -73,6 +73,7 @@ public final class SsaDecoder extends SimpleSubtitleDecoder { *

Parsed from the {@code PlayResX} value in the {@code [Script Info]} section. */ private float screenWidth; + /** * The vertical resolution used by the subtitle author - all cue positions are relative to this. * diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaStyle.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaStyle.java index f644b08feb..e8b27a75ee 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaStyle.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaStyle.java @@ -441,6 +441,7 @@ import java.util.regex.Pattern; /** Matches "\pos(x,y)" and returns "x" in group 1 and "y" in group 2 */ private static final Pattern POSITION_PATTERN = Pattern.compile(Util.formatInvariant("\\\\pos\\((%1$s),(%1$s)\\)", PADDED_DECIMAL_PATTERN)); + /** Matches "\move(x1,y1,x2,y2[,t1,t2])" and returns "x2" in group 1 and "y2" in group 2 */ private static final Pattern MOVE_PATTERN = Pattern.compile( diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/WebvttCueParser.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/WebvttCueParser.java index 456dd61680..ff6d0fd298 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/WebvttCueParser.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/WebvttCueParser.java @@ -971,6 +971,7 @@ public final class WebvttCueParser { (e1, e2) -> Integer.compare(e1.startTag.position, e2.startTag.position); private final StartTag startTag; + /** * The position of the end of this element's text in the un-marked-up cue text (i.e. the * corollary to {@link StartTag#position}). diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/AdtsExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/AdtsExtractor.java index e1013e689f..547a56eaea 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/AdtsExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/AdtsExtractor.java @@ -65,6 +65,7 @@ public final class AdtsExtractor implements Extractor { flag = true, value = {FLAG_ENABLE_CONSTANT_BITRATE_SEEKING, FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS}) public @interface Flags {} + /** * Flag to force enable seeking using a constant bitrate assumption in cases where seeking would * otherwise not be possible. @@ -73,6 +74,7 @@ public final class AdtsExtractor implements Extractor { * are not precise, especially when the stream bitrate varies a lot. */ public static final int FLAG_ENABLE_CONSTANT_BITRATE_SEEKING = 1; + /** * Like {@link #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING}, except that seeking is also enabled in * cases where the content length (and hence the duration of the media) is unknown. Application @@ -87,11 +89,13 @@ public final class AdtsExtractor implements Extractor { public static final int FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS = 1 << 1; private static final int MAX_PACKET_SIZE = 2 * 1024; + /** * The maximum number of bytes to search when sniffing, excluding the header, before giving up. * Frame sizes are represented by 13-bit fields, so expect a valid frame in the first 8192 bytes. */ private static final int MAX_SNIFF_BYTES = 8 * 1024; + /** * The maximum number of frames to use when calculating the average frame size for constant * bitrate seeking. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DefaultTsPayloadReaderFactory.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DefaultTsPayloadReaderFactory.java index 11fa10f074..b55157081e 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DefaultTsPayloadReaderFactory.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DefaultTsPayloadReaderFactory.java @@ -66,29 +66,34 @@ public final class DefaultTsPayloadReaderFactory implements TsPayloadReader.Fact * synchronization samples (key-frames). */ public static final int FLAG_ALLOW_NON_IDR_KEYFRAMES = 1; + /** * Prevents the creation of {@link AdtsReader} and {@link LatmReader} instances. This flag should * be enabled if the transport stream contains no packets for an AAC elementary stream that is * declared in the PMT. */ public static final int FLAG_IGNORE_AAC_STREAM = 1 << 1; + /** * Prevents the creation of {@link H264Reader} instances. This flag should be enabled if the * transport stream contains no packets for an H.264 elementary stream that is declared in the * PMT. */ public static final int FLAG_IGNORE_H264_STREAM = 1 << 2; + /** * When extracting H.264 samples, whether to split the input stream into access units (samples) * based on slice headers. This flag should be disabled if the stream contains access unit * delimiters (AUDs). */ public static final int FLAG_DETECT_ACCESS_UNITS = 1 << 3; + /** * Prevents the creation of {@link SectionPayloadReader}s for splice information sections * (SCTE-35). */ public static final int FLAG_IGNORE_SPLICE_INFO_STREAM = 1 << 4; + /** * Whether the list of {@code closedCaptionFormats} passed to {@link * DefaultTsPayloadReaderFactory#DefaultTsPayloadReaderFactory(int, List)} should be used in spite @@ -96,6 +101,7 @@ public final class DefaultTsPayloadReaderFactory implements TsPayloadReader.Fact * closedCaptionFormats} will be ignored if the PMT contains closed captions service descriptors. */ public static final int FLAG_OVERRIDE_CAPTION_DESCRIPTORS = 1 << 5; + /** * Sets whether HDMV DTS audio streams will be handled. If this flag is set, SCTE subtitles will * not be detected, as they share the same elementary stream type as HDMV DTS. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H263Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H263Reader.java index a623d7dadf..302dd500e8 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H263Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H263Reader.java @@ -431,6 +431,7 @@ public final class H263Reader implements ElementaryStreamReader { /** Byte offset of vop_coding_type after the start code value. */ private static final int OFFSET_VOP_CODING_TYPE = 1; + /** Value of vop_coding_type for intra video object planes. */ private static final int VOP_CODING_TYPE_INTRA = 0; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java index 049e2c003b..d29c77fc84 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java @@ -73,8 +73,10 @@ public final class TsExtractor implements Extractor { /** Behave as defined in ISO/IEC 13818-1. */ public static final int MODE_MULTI_PMT = 0; + /** Assume only one PMT will be contained in the stream, even if more are declared by the PAT. */ public static final int MODE_SINGLE_PMT = 1; + /** * Enable single PMT mode, map {@link TrackOutput}s by their type (instead of PID) and ignore * continuity counters. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsPayloadReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsPayloadReader.java index f5b2a76575..fc89d4f7d8 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsPayloadReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsPayloadReader.java @@ -201,10 +201,12 @@ public interface TsPayloadReader { /** Indicates the presence of the payload_unit_start_indicator in the TS packet header. */ int FLAG_PAYLOAD_UNIT_START_INDICATOR = 1; + /** * Indicates the presence of the random_access_indicator in the TS packet header adaptation field. */ int FLAG_RANDOM_ACCESS_INDICATOR = 1 << 1; + /** Indicates the presence of the data_alignment_indicator in the PES header. */ int FLAG_DATA_ALIGNMENT_INDICATOR = 1 << 2; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/wav/WavExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/wav/WavExtractor.java index dea141335a..7195777653 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/wav/WavExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/wav/WavExtractor.java @@ -276,17 +276,20 @@ public final class WavExtractor implements Extractor { private final TrackOutput trackOutput; private final WavFormat wavFormat; private final Format format; + /** The target size of each output sample, in bytes. */ private final int targetSampleSizeBytes; /** The time at which the writer was last {@link #reset}. */ private long startTimeUs; + /** * The number of bytes that have been written to {@link #trackOutput} but have yet to be * included as part of a sample (i.e. the corresponding call to {@link * TrackOutput#sampleMetadata} has yet to be made). */ private int pendingOutputBytes; + /** * The total number of frames in samples that have been written to the trackOutput since the * last call to {@link #reset}. @@ -398,25 +401,32 @@ public final class WavExtractor implements Extractor { /** Number of frames per block of the input (yet to be decoded) data. */ private final int framesPerBlock; + /** Target for the input (yet to be decoded) data. */ private final byte[] inputData; + /** Target for decoded (yet to be output) data. */ private final ParsableByteArray decodedData; + /** The target size of each output sample, in frames. */ private final int targetSampleSizeFrames; + /** The output format. */ private final Format format; /** The number of pending bytes in {@link #inputData}. */ private int pendingInputBytes; + /** The time at which the writer was last {@link #reset}. */ private long startTimeUs; + /** * The number of bytes that have been written to {@link #trackOutput} but have yet to be * included as part of a sample (i.e. the corresponding call to {@link * TrackOutput#sampleMetadata} has yet to be made). */ private int pendingOutputBytes; + /** * The total number of frames in samples that have been written to the trackOutput since the * last call to {@link #reset}. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/wav/WavFormat.java b/libraries/extractor/src/main/java/androidx/media3/extractor/wav/WavFormat.java index 714e4eb44e..ac315e0828 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/wav/WavFormat.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/wav/WavFormat.java @@ -23,16 +23,22 @@ package androidx.media3.extractor.wav; * defined in RFC 2361 Appendix A. */ public final int formatType; + /** The number of channels. */ public final int numChannels; + /** The sample rate in Hertz. */ public final int frameRateHz; + /** The average bytes per second for the sample data. */ public final int averageBytesPerSecond; + /** The block size in bytes. */ public final int blockSize; + /** Bits per sample for a single channel. */ public final int bitsPerSample; + /** Extra data appended to the format chunk. */ public final byte[] extraData; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/wav/WavHeaderReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/wav/WavHeaderReader.java index 3c24cd5009..53cf0f902a 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/wav/WavHeaderReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/wav/WavHeaderReader.java @@ -194,6 +194,7 @@ import java.io.IOException; /** 4-character identifier, stored as an integer, for this chunk. */ public final int id; + /** Size of this chunk in bytes. */ public final long size; diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/mp3/XingSeekerTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/mp3/XingSeekerTest.java index f1e6fe5518..11fbb3e204 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/mp3/XingSeekerTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/mp3/XingSeekerTest.java @@ -43,8 +43,10 @@ public final class XingSeekerTest { /** Data size, as encoded in {@link #XING_FRAME_PAYLOAD}. */ private static final int DATA_SIZE_BYTES = 948505; + /** Duration of the audio stream in microseconds, encoded in {@link #XING_FRAME_PAYLOAD}. */ private static final int STREAM_DURATION_US = 59271836; + /** The length of the stream in bytes. */ private static final int STREAM_LENGTH = XING_FRAME_POSITION + DATA_SIZE_BYTES; diff --git a/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Muxer.java b/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Muxer.java index 69eeef217a..58b6086bef 100644 --- a/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Muxer.java +++ b/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Muxer.java @@ -76,8 +76,10 @@ public final class Mp4Muxer { LAST_FRAME_DURATION_BEHAVIOR_INSERT_SHORT_FRAME }) public @interface LastFrameDurationBehavior {} + /** Insert a zero-length last sample. */ public static final int LAST_FRAME_DURATION_BEHAVIOR_INSERT_SHORT_FRAME = 0; + /** * Use the difference between the last timestamp and the one before that as the duration of the * last sample. diff --git a/libraries/session/src/main/java/androidx/media3/session/ConnectionRequest.java b/libraries/session/src/main/java/androidx/media3/session/ConnectionRequest.java index b9f6258594..805baffc58 100644 --- a/libraries/session/src/main/java/androidx/media3/session/ConnectionRequest.java +++ b/libraries/session/src/main/java/androidx/media3/session/ConnectionRequest.java @@ -69,6 +69,7 @@ import androidx.media3.common.util.Util; private static final String FIELD_PID = Util.intToStringMaxRadix(2); private static final String FIELD_CONNECTION_HINTS = Util.intToStringMaxRadix(3); private static final String FIELD_CONTROLLER_INTERFACE_VERSION = Util.intToStringMaxRadix(4); + // Next id: 5 @Override diff --git a/libraries/session/src/main/java/androidx/media3/session/ConnectionState.java b/libraries/session/src/main/java/androidx/media3/session/ConnectionState.java index c681ab4420..b4c808373f 100644 --- a/libraries/session/src/main/java/androidx/media3/session/ConnectionState.java +++ b/libraries/session/src/main/java/androidx/media3/session/ConnectionState.java @@ -82,6 +82,7 @@ import androidx.media3.common.util.Util; private static final String FIELD_TOKEN_EXTRAS = Util.intToStringMaxRadix(6); private static final String FIELD_PLAYER_INFO = Util.intToStringMaxRadix(7); private static final String FIELD_SESSION_INTERFACE_VERSION = Util.intToStringMaxRadix(8); + // Next field key = 9 @Override diff --git a/libraries/session/src/main/java/androidx/media3/session/DefaultMediaNotificationProvider.java b/libraries/session/src/main/java/androidx/media3/session/DefaultMediaNotificationProvider.java index a6e85731cd..9afbf8994b 100644 --- a/libraries/session/src/main/java/androidx/media3/session/DefaultMediaNotificationProvider.java +++ b/libraries/session/src/main/java/androidx/media3/session/DefaultMediaNotificationProvider.java @@ -223,11 +223,13 @@ public class DefaultMediaNotificationProvider implements MediaNotification.Provi /** The default ID used for the {@link MediaNotification#notificationId}. */ public static final int DEFAULT_NOTIFICATION_ID = 1001; + /** * The default ID used for the {@link NotificationChannel} on which created notifications are * posted on. */ public static final String DEFAULT_CHANNEL_ID = "default_channel_id"; + /** * The default name used for the {@link NotificationChannel} on which created notifications are * posted on. diff --git a/libraries/session/src/main/java/androidx/media3/session/LibraryResult.java b/libraries/session/src/main/java/androidx/media3/session/LibraryResult.java index accd427207..4310bf697e 100644 --- a/libraries/session/src/main/java/androidx/media3/session/LibraryResult.java +++ b/libraries/session/src/main/java/androidx/media3/session/LibraryResult.java @@ -399,6 +399,7 @@ public final class LibraryResult implements Bundleable { private static final int VALUE_TYPE_VOID = 1; private static final int VALUE_TYPE_ITEM = 2; private static final int VALUE_TYPE_ITEM_LIST = 3; + /** The value type isn't known because the result is carrying an error. */ private static final int VALUE_TYPE_ERROR = 4; } diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaController.java b/libraries/session/src/main/java/androidx/media3/session/MediaController.java index 0dbaf68657..4286e2229f 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaController.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaController.java @@ -1689,6 +1689,7 @@ public class MediaController implements Player { } impl.setDeviceVolume(volume, flags); } + /** * @deprecated Use {@link #increaseDeviceVolume(int)} instead. */ @@ -1712,6 +1713,7 @@ public class MediaController implements Player { } impl.increaseDeviceVolume(flags); } + /** * @deprecated Use {@link #decreaseDeviceVolume(int)} instead. */ @@ -1735,6 +1737,7 @@ public class MediaController implements Player { } impl.decreaseDeviceVolume(flags); } + /** * @deprecated Use {@link #setDeviceMuted(boolean, int)} instead. */ diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaSession.java b/libraries/session/src/main/java/androidx/media3/session/MediaSession.java index 21b1cb9ce1..bba9acb2c8 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaSession.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaSession.java @@ -232,6 +232,7 @@ public class MediaSession { // It's better to have private static lock instead of using MediaSession.class because the // private lock object isn't exposed. private static final Object STATIC_LOCK = new Object(); + // Note: This checks the uniqueness of a session ID only in single process. // When the framework becomes able to check the uniqueness, this logic should be removed. @GuardedBy("STATIC_LOCK") @@ -369,6 +370,7 @@ public class MediaSession { /** The {@linkplain #getControllerVersion() controller version} of legacy controllers. */ public static final int LEGACY_CONTROLLER_VERSION = 0; + /** The {@linkplain #getInterfaceVersion()} interface version} of legacy controllers. */ @UnstableApi public static final int LEGACY_CONTROLLER_INTERFACE_VERSION = 0; @@ -1282,6 +1284,7 @@ public class MediaSession { public static final class MediaItemsWithStartPosition { /** List of {@linkplain MediaItem media items}. */ public final ImmutableList mediaItems; + /** * Index to start playing at in {@link #mediaItems}. * @@ -1289,6 +1292,7 @@ public class MediaSession { * C#INDEX_UNSET} to start playing from the default index in the playlist. */ public final int startIndex; + /** * Position in milliseconds to start playing from in the starting media item. * diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaUtils.java b/libraries/session/src/main/java/androidx/media3/session/MediaUtils.java index cf078a7216..8cb439a0c4 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaUtils.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaUtils.java @@ -110,6 +110,7 @@ import java.util.concurrent.TimeoutException; public static final String TAG = "MediaUtils"; public static final int TRANSACTION_SIZE_LIMIT_IN_BYTES = 256 * 1024; // 256KB + /** Constant to identify whether two calculated positions are considered as same */ public static final long POSITION_DIFF_TOLERANCE_MS = 100; diff --git a/libraries/session/src/main/java/androidx/media3/session/PlayerInfo.java b/libraries/session/src/main/java/androidx/media3/session/PlayerInfo.java index 4fa7ac0714..bc80edcf35 100644 --- a/libraries/session/src/main/java/androidx/media3/session/PlayerInfo.java +++ b/libraries/session/src/main/java/androidx/media3/session/PlayerInfo.java @@ -66,8 +66,10 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; public static final BundlingExclusions NONE = new BundlingExclusions( /* isTimelineExcluded= */ false, /* areCurrentTracksExcluded= */ false); + /** Whether the {@linkplain PlayerInfo#timeline timeline} is excluded. */ public final boolean isTimelineExcluded; + /** Whether the {@linkplain PlayerInfo#currentTracks current tracks} are excluded. */ public final boolean areCurrentTracksExcluded; @@ -81,6 +83,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; private static final String FIELD_IS_TIMELINE_EXCLUDED = Util.intToStringMaxRadix(0); private static final String FIELD_ARE_CURRENT_TRACKS_EXCLUDED = Util.intToStringMaxRadix(1); + // Next field key = 2 @UnstableApi @@ -822,6 +825,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; private static final String FIELD_TRACK_SELECTION_PARAMETERS = Util.intToStringMaxRadix(29); private static final String FIELD_CURRENT_TRACKS = Util.intToStringMaxRadix(30); private static final String FIELD_TIMELINE_CHANGE_REASON = Util.intToStringMaxRadix(31); + // Next field key = 32 public Bundle toBundle( diff --git a/libraries/session/src/main/java/androidx/media3/session/SessionTokenImplBase.java b/libraries/session/src/main/java/androidx/media3/session/SessionTokenImplBase.java index 22b0d9df67..6c027b51c2 100644 --- a/libraries/session/src/main/java/androidx/media3/session/SessionTokenImplBase.java +++ b/libraries/session/src/main/java/androidx/media3/session/SessionTokenImplBase.java @@ -214,6 +214,7 @@ import com.google.common.base.Objects; private static final String FIELD_ISESSION = Util.intToStringMaxRadix(6); private static final String FIELD_EXTRAS = Util.intToStringMaxRadix(7); private static final String FIELD_INTERFACE_VERSION = Util.intToStringMaxRadix(8); + // Next field key = 9 @Override diff --git a/libraries/session/src/test/java/androidx/media3/session/DefaultMediaNotificationProviderTest.java b/libraries/session/src/test/java/androidx/media3/session/DefaultMediaNotificationProviderTest.java index dc43b274e7..86c024c042 100644 --- a/libraries/session/src/test/java/androidx/media3/session/DefaultMediaNotificationProviderTest.java +++ b/libraries/session/src/test/java/androidx/media3/session/DefaultMediaNotificationProviderTest.java @@ -69,6 +69,7 @@ public class DefaultMediaNotificationProviderTest { private static final String TEST_CHANNEL_ID = "test_channel_id"; private static final NotificationCompat.Action fakeAction = new NotificationCompat.Action(0, null, null); + /** * The key string is defined as @@ -76,6 +77,7 @@ public class DefaultMediaNotificationProviderTest { */ private static final String EXTRA_ALLOW_GENERATED_REPLIES = "android.support.allowGeneratedReplies"; + /** * The key string is defined as @@ -83,6 +85,7 @@ public class DefaultMediaNotificationProviderTest { */ private static final String EXTRA_SHOWS_USER_INTERFACE = "android.support.action.showsUserInterface"; + /** * The key string is defined as diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_opus.mp4.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_opus.mp4.0.dump index 36e01036bf..e02ee654f5 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_opus.mp4.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_opus.mp4.0.dump @@ -22,7 +22,7 @@ track 0: data = length 8, hash 72CBCBF5 data = length 8, hash 79C07075 sample 0: - time = 0 + time = -6500 flags = 1 data = length 3, hash 4732 sample 1: diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_opus.mp4.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_opus.mp4.unknown_length.dump index 36e01036bf..e02ee654f5 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_opus.mp4.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_opus.mp4.unknown_length.dump @@ -22,7 +22,7 @@ track 0: data = length 8, hash 72CBCBF5 data = length 8, hash 79C07075 sample 0: - time = 0 + time = -6500 flags = 1 data = length 3, hash 4732 sample 1: diff --git a/libraries/test_session_current/src/main/java/androidx/media3/session/MockMediaLibraryService.java b/libraries/test_session_current/src/main/java/androidx/media3/session/MockMediaLibraryService.java index cc0b452106..745182949b 100644 --- a/libraries/test_session_current/src/main/java/androidx/media3/session/MockMediaLibraryService.java +++ b/libraries/test_session_current/src/main/java/androidx/media3/session/MockMediaLibraryService.java @@ -83,9 +83,11 @@ import java.util.concurrent.Executors; public class MockMediaLibraryService extends MediaLibraryService { /** ID of the session that this service will create. */ public static final String ID = "TestLibrary"; + /** Key used in connection hints to instruct the mock service to use a given library root. */ public static final String CONNECTION_HINTS_CUSTOM_LIBRARY_ROOT = "CONNECTION_HINTS_CUSTOM_LIBRARY_ROOT"; + /** * Key used in connection hints to instruct the mock service to remove {@link * SessionCommand#COMMAND_CODE_LIBRARY_SEARCH} from the available commands in {@link diff --git a/libraries/test_session_current/src/main/java/androidx/media3/session/MockPlayer.java b/libraries/test_session_current/src/main/java/androidx/media3/session/MockPlayer.java index 6341a5bf89..08cf2771a9 100644 --- a/libraries/test_session_current/src/main/java/androidx/media3/session/MockPlayer.java +++ b/libraries/test_session_current/src/main/java/androidx/media3/session/MockPlayer.java @@ -115,98 +115,145 @@ public class MockPlayer implements Player { /** Maps to {@link Player#addMediaItem(MediaItem)}. */ public static final int METHOD_ADD_MEDIA_ITEM = 0; + /** Maps to {@link Player#addMediaItems(List)}. */ public static final int METHOD_ADD_MEDIA_ITEMS = 1; + /** Maps to {@link Player#addMediaItem(int, MediaItem)}. */ public static final int METHOD_ADD_MEDIA_ITEM_WITH_INDEX = 2; + /** Maps to {@link Player#addMediaItems(int, List)}. */ public static final int METHOD_ADD_MEDIA_ITEMS_WITH_INDEX = 3; + /** Maps to {@link Player#clearMediaItems()}. */ public static final int METHOD_CLEAR_MEDIA_ITEMS = 4; + /** Maps to {@link Player#decreaseDeviceVolume()}. */ public static final int METHOD_DECREASE_DEVICE_VOLUME = 5; + /** Maps to {@link Player#increaseDeviceVolume()}. */ public static final int METHOD_INCREASE_DEVICE_VOLUME = 6; + /** Maps to {@link Player#moveMediaItem(int, int)}. */ public static final int METHOD_MOVE_MEDIA_ITEM = 7; + /** Maps to {@link Player#moveMediaItems(int, int, int)}. */ public static final int METHOD_MOVE_MEDIA_ITEMS = 8; + /** Maps to {@link Player#pause()}. */ public static final int METHOD_PAUSE = 9; + /** Maps to {@link Player#play()}. */ public static final int METHOD_PLAY = 10; + /** Maps to {@link Player#prepare()}. */ public static final int METHOD_PREPARE = 11; + /** Maps to {@link Player#release()}. */ public static final int METHOD_RELEASE = 12; + /** Maps to {@link Player#removeMediaItem(int)}. */ public static final int METHOD_REMOVE_MEDIA_ITEM = 13; + /** Maps to {@link Player#removeMediaItems(int, int)}. */ public static final int METHOD_REMOVE_MEDIA_ITEMS = 14; + /** Maps to {@link Player#seekBack()}. */ public static final int METHOD_SEEK_BACK = 15; + /** Maps to {@link Player#seekForward()}. */ public static final int METHOD_SEEK_FORWARD = 16; + /** Maps to {@link Player#seekTo(long)}. */ public static final int METHOD_SEEK_TO = 17; + /** Maps to {@link Player#seekToDefaultPosition()}. */ public static final int METHOD_SEEK_TO_DEFAULT_POSITION = 18; + /** Maps to {@link Player#seekToDefaultPosition(int)}. */ public static final int METHOD_SEEK_TO_DEFAULT_POSITION_WITH_MEDIA_ITEM_INDEX = 19; + /** Maps to {@link Player#seekToNext()}. */ public static final int METHOD_SEEK_TO_NEXT = 20; + /** Maps to {@link Player#seekToNextMediaItem()}. */ public static final int METHOD_SEEK_TO_NEXT_MEDIA_ITEM = 21; + /** Maps to {@link Player#seekToPrevious()}. */ public static final int METHOD_SEEK_TO_PREVIOUS = 22; + /** Maps to {@link Player#seekToPreviousMediaItem()}. */ public static final int METHOD_SEEK_TO_PREVIOUS_MEDIA_ITEM = 23; + /** Maps to {@link Player#seekTo(int, long)}. */ public static final int METHOD_SEEK_TO_WITH_MEDIA_ITEM_INDEX = 24; + /** Maps to {@link Player#setDeviceMuted(boolean)}. */ public static final int METHOD_SET_DEVICE_MUTED = 25; + /** Maps to {@link Player#setDeviceVolume(int)}. */ public static final int METHOD_SET_DEVICE_VOLUME = 26; + /** Maps to {@link Player#setMediaItem(MediaItem)}. */ public static final int METHOD_SET_MEDIA_ITEM = 27; + /** Maps to {@link Player#setMediaItem(MediaItem, boolean)}. */ public static final int METHOD_SET_MEDIA_ITEM_WITH_RESET_POSITION = 28; + /** Maps to {@link Player#setMediaItem(MediaItem, long)}. */ public static final int METHOD_SET_MEDIA_ITEM_WITH_START_POSITION = 29; + /** Maps to {@link Player#setMediaItems(List)}. */ public static final int METHOD_SET_MEDIA_ITEMS = 30; + /** Maps to {@link Player#setMediaItems(List, boolean)}. */ public static final int METHOD_SET_MEDIA_ITEMS_WITH_RESET_POSITION = 31; + /** Maps to {@link Player#setMediaItems(List, int, long)}. */ public static final int METHOD_SET_MEDIA_ITEMS_WITH_START_INDEX = 32; + /** Maps to {@link Player#setPlayWhenReady(boolean)}. */ public static final int METHOD_SET_PLAY_WHEN_READY = 33; + /** Maps to {@link Player#setPlaybackParameters(PlaybackParameters)}. */ public static final int METHOD_SET_PLAYBACK_PARAMETERS = 34; + /** Maps to {@link Player#setPlaybackSpeed(float)}. */ public static final int METHOD_SET_PLAYBACK_SPEED = 35; + /** Maps to {@link Player#setPlaylistMetadata(MediaMetadata)}. */ public static final int METHOD_SET_PLAYLIST_METADATA = 36; + /** Maps to {@link Player#setRepeatMode(int)}. */ public static final int METHOD_SET_REPEAT_MODE = 37; + /** Maps to {@link Player#setShuffleModeEnabled(boolean)}. */ public static final int METHOD_SET_SHUFFLE_MODE = 38; + /** Maps to {@link Player#setTrackSelectionParameters(TrackSelectionParameters)}. */ public static final int METHOD_SET_TRACK_SELECTION_PARAMETERS = 39; + /** Maps to {@link Player#setVolume(float)}. */ public static final int METHOD_SET_VOLUME = 40; + /** Maps to {@link Player#stop()}. */ public static final int METHOD_STOP = 41; + /** Maps to {@link Player#decreaseDeviceVolume(int)}. */ public static final int METHOD_DECREASE_DEVICE_VOLUME_WITH_FLAGS = 42; + /** Maps to {@link Player#increaseDeviceVolume(int)}. */ public static final int METHOD_INCREASE_DEVICE_VOLUME_WITH_FLAGS = 43; + /** Maps to {@link Player#setDeviceMuted(boolean, int)}. */ public static final int METHOD_SET_DEVICE_MUTED_WITH_FLAGS = 44; + /** Maps to {@link Player#setDeviceVolume(int, int)}. */ public static final int METHOD_SET_DEVICE_VOLUME_WITH_FLAGS = 45; + /** Maps to {@link Player#replaceMediaItem(int, MediaItem)}. */ public static final int METHOD_REPLACE_MEDIA_ITEM = 46; + /** Maps to {@link Player#replaceMediaItems(int, int, List)} . */ public static final int METHOD_REPLACE_MEDIA_ITEMS = 47; diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/ActionSchedule.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/ActionSchedule.java index 451404139e..ed70354e76 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/ActionSchedule.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/ActionSchedule.java @@ -381,6 +381,7 @@ public final class ActionSchedule { /* positionMs= */ C.TIME_UNSET, mediaSources)); } + /** * Schedules a add media items action to be executed. * diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/DumpFileAsserts.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/DumpFileAsserts.java index 7059c004ae..bf870b308f 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/DumpFileAsserts.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/DumpFileAsserts.java @@ -60,8 +60,10 @@ public class DumpFileAsserts { flag = true, value = {COMPARE_WITH_EXISTING, WRITE_TO_LOCAL, WRITE_TO_DEVICE}) private @interface DumpFilesAction {} + /** Compare output with existing dump file. */ private static final int COMPARE_WITH_EXISTING = 0; + /** * Write output to the project folder {@code testdata/src/test}. * @@ -69,6 +71,7 @@ public class DumpFileAsserts { * tests are run in another environment. */ private static final int WRITE_TO_LOCAL = 1; + /** Write output to folder {@code /storage/emulated/0/Android/data} of device. */ private static final int WRITE_TO_DEVICE = 1 << 1; diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/ExtractorAsserts.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/ExtractorAsserts.java index 979ac9d097..e4b2e86213 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/ExtractorAsserts.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/ExtractorAsserts.java @@ -90,10 +90,13 @@ public final class ExtractorAsserts { * consuming it. */ public final boolean sniffFirst; + /** Whether to simulate IO errors. */ public final boolean simulateIOErrors; + /** Whether to simulate unknown input length. */ public final boolean simulateUnknownLength; + /** Whether to simulate partial reads. */ public final boolean simulatePartialReads; @@ -409,6 +412,7 @@ public final class ExtractorAsserts { simulationConfig.simulateUnknownLength, simulationConfig.simulatePartialReads); } + /** * Asserts that an extractor consumes valid input data successfully under the specified * conditions. diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeDataSet.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeDataSet.java index 12ca43eee5..aa295a1044 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeDataSet.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeDataSet.java @@ -132,6 +132,7 @@ public class FakeDataSet { } private final FakeDataSet dataSet; + /** Uri of the data or null if this is the default FakeData. */ @Nullable public final Uri uri; diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeExoMediaDrm.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeExoMediaDrm.java index 600a6f9524..4f802f073a 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeExoMediaDrm.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeExoMediaDrm.java @@ -154,8 +154,10 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { /** Key for use with the Map returned from {@link FakeExoMediaDrm#queryKeyStatus(byte[])}. */ public static final String KEY_STATUS_KEY = "KEY_STATUS"; + /** Value for use with the Map returned from {@link FakeExoMediaDrm#queryKeyStatus(byte[])}. */ public static final String KEY_STATUS_AVAILABLE = "AVAILABLE"; + /** Value for use with the Map returned from {@link FakeExoMediaDrm#queryKeyStatus(byte[])}. */ public static final String KEY_STATUS_UNAVAILABLE = "UNAVAILABLE"; diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeRenderer.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeRenderer.java index e4c99ffa64..4a05ae7a29 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeRenderer.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeRenderer.java @@ -44,6 +44,7 @@ import java.util.List; public class FakeRenderer extends BaseRenderer { private static final String TAG = "FakeRenderer"; + /** * The amount of time ahead of the current playback position that the renderer reads from the * source. A real renderer will typically read ahead by a small amount due to pipelining through diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/VideoFrameProcessorTestRunner.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/VideoFrameProcessorTestRunner.java index a10a19b53c..8a43c37b49 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/VideoFrameProcessorTestRunner.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/VideoFrameProcessorTestRunner.java @@ -193,6 +193,7 @@ public final class VideoFrameProcessorTestRunner { this.outputColorInfo = outputColorInfo; return this; } + /** * Sets whether input comes from an external texture. See {@link * VideoFrameProcessor.Factory#create}. diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/AndroidTestUtil.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/AndroidTestUtil.java index db0856e05b..1718eeb81e 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/AndroidTestUtil.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/AndroidTestUtil.java @@ -59,6 +59,7 @@ public final class AndroidTestUtil { /** A realtime {@linkplain MediaFormat#KEY_PRIORITY encoder priority}. */ public static final int MEDIA_CODEC_PRIORITY_REALTIME = 0; + /** * A non-realtime (as fast as possible) {@linkplain MediaFormat#KEY_PRIORITY encoder priority}. */ diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/ExportTestResult.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/ExportTestResult.java index ed9bc25905..e721962ba4 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/ExportTestResult.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/ExportTestResult.java @@ -127,25 +127,31 @@ public class ExportTestResult { /** The {@link ExportResult} of the export. */ public final ExportResult exportResult; + /** The path to the file created in the export, or {@code null} if unset. */ @Nullable public final String filePath; + /** * The amount of time taken to perform the export in milliseconds, or {@link C#TIME_UNSET} if * unset. */ public final long elapsedTimeMs; + /** * The average rate (per second) at which frames were processed by the transformer, or {@link * C#RATE_UNSET} if unset. */ public final float throughputFps; + /** The SSIM score of the export, or {@link #SSIM_UNSET} if unset. */ public final double ssim; + /** * The {@link FallbackDetails} describing the fallbacks that occurred doing export, or {@code * null} if no fallback occurred. */ @Nullable public final FallbackDetails fallbackDetails; + /** * The {@link Exception} thrown during post-export analysis, or {@code null} if nothing was * thrown. diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerMixedInputEndToEndTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerMixedInputEndToEndTest.java index 146c75ee14..307ababe2b 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerMixedInputEndToEndTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerMixedInputEndToEndTest.java @@ -186,6 +186,7 @@ public class TransformerMixedInputEndToEndTest { .setFrameRate(frameCount) .build(); } + /** * Creates an {@link EditedMediaItem} with video, with audio removed and a {@link Presentation} of * specified {@code height}. diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/DefaultVideoFrameProcessorTextureOutputPixelTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/DefaultVideoFrameProcessorTextureOutputPixelTest.java index c34e391338..a8179f8303 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/DefaultVideoFrameProcessorTextureOutputPixelTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/DefaultVideoFrameProcessorTextureOutputPixelTest.java @@ -79,8 +79,10 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest { /** Input SDR video of which we only use the first frame. */ private static final String INPUT_SDR_MP4_ASSET_STRING = "media/mp4/sample.mp4"; + /** Input PQ video of which we only use the first frame. */ private static final String INPUT_PQ_MP4_ASSET_STRING = "media/mp4/hdr10-720p.mp4"; + /** Input HLG video of which we only use the first frame. */ private static final String INPUT_HLG10_MP4_ASSET_STRING = "media/mp4/hlg-1080p.mp4"; diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ToneMapHdrToSdrUsingOpenGlPixelTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ToneMapHdrToSdrUsingOpenGlPixelTest.java index 7521ceec9e..a4eb3b2d37 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ToneMapHdrToSdrUsingOpenGlPixelTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ToneMapHdrToSdrUsingOpenGlPixelTest.java @@ -54,6 +54,7 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public final class ToneMapHdrToSdrUsingOpenGlPixelTest { private static final String TAG = "ToneMapHdrToSdrGl"; + /** * Maximum allowed average pixel difference between the expected and actual edited images in * on-device pixel difference-based tests. The value is chosen so that differences in behavior @@ -73,6 +74,7 @@ public final class ToneMapHdrToSdrUsingOpenGlPixelTest { /** Input HLG video of which we only use the first frame. */ private static final String INPUT_HLG_MP4_ASSET_STRING = "media/mp4/hlg-1080p.mp4"; + /** Input PQ video of which we only use the first frame. */ private static final String INPUT_PQ_MP4_ASSET_STRING = "media/mp4/hdr10-720p.mp4"; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/AssetLoader.java b/libraries/transformer/src/main/java/androidx/media3/transformer/AssetLoader.java index 62938bb438..bbc3b8f1a6 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/AssetLoader.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/AssetLoader.java @@ -147,8 +147,10 @@ public interface AssetLoader { SUPPORTED_OUTPUT_TYPE_DECODED, }) @interface SupportedOutputTypes {} + /** Indicates that the asset loader can output encoded samples. */ int SUPPORTED_OUTPUT_TYPE_ENCODED = 1; + /** Indicates that the asset loader can output decoded samples. */ int SUPPORTED_OUTPUT_TYPE_DECODED = 1 << 1; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/Composition.java b/libraries/transformer/src/main/java/androidx/media3/transformer/Composition.java index 5d45bea420..61cec33e18 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/Composition.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/Composition.java @@ -175,20 +175,24 @@ public final class Composition { *

For more information, see {@link Builder#Builder(List)}. */ public final ImmutableList sequences; + /** The {@link Effects} to apply to the composition. */ public final Effects effects; + /** * Whether the output file should always contain an audio track. * *

For more information, see {@link Builder#experimentalSetForceAudioTrack(boolean)}. */ public final boolean forceAudioTrack; + /** * Whether to transmux the {@linkplain MediaItem media items'} audio tracks. * *

For more information, see {@link Builder#setTransmuxAudio(boolean)}. */ public final boolean transmuxAudio; + /** * Whether to transmux the {@linkplain MediaItem media items'} video tracks. * diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultAssetLoaderFactory.java b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultAssetLoaderFactory.java index 2255ca12db..0930c1cbf3 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultAssetLoaderFactory.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultAssetLoaderFactory.java @@ -42,6 +42,7 @@ public final class DefaultAssetLoaderFactory implements AssetLoader.Factory { private AssetLoader.@MonotonicNonNull Factory imageAssetLoaderFactory; private AssetLoader.@MonotonicNonNull Factory exoPlayerAssetLoaderFactory; + /** * Creates an instance. * diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultCodec.java b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultCodec.java index 91fa44a0f9..a45918fbcb 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultCodec.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultCodec.java @@ -59,6 +59,7 @@ public class DefaultCodec implements Codec { private static final String TAG = "DefaultCodec"; private final BufferInfo outputBufferInfo; + /** The {@link MediaFormat} used to configure the underlying {@link MediaCodec}. */ private final MediaFormat configurationMediaFormat; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java index 18d1936f07..5c7942dfee 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java @@ -47,6 +47,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; @UnstableApi public final class DefaultEncoderFactory implements Codec.EncoderFactory { private static final int DEFAULT_FRAME_RATE = 30; + /** Best effort, or as-fast-as-possible priority setting for {@link MediaFormat#KEY_PRIORITY}. */ private static final int PRIORITY_BEST_EFFORT = 1; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultMuxer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultMuxer.java index 8682574fbf..3296f3690d 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultMuxer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultMuxer.java @@ -41,6 +41,7 @@ public final class DefaultMuxer implements Muxer { public Factory() { this(/* maxDelayBetweenSamplesMs= */ DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS); } + /** * Creates an instance. * diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItem.java b/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItem.java index 7305767c16..a6375b077c 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItem.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItem.java @@ -184,10 +184,13 @@ public final class EditedMediaItem { /** The {@link MediaItem} on which transformations are applied. */ public final MediaItem mediaItem; + /** Whether to remove the audio from the {@link #mediaItem}. */ public final boolean removeAudio; + /** Whether to remove the video from the {@link #mediaItem}. */ public final boolean removeVideo; + /** * Whether to flatten the {@link #mediaItem} if it contains slow motion markers. * @@ -206,11 +209,14 @@ public final class EditedMediaItem { * */ public final boolean flattenForSlowMotion; + /** The duration of the image in the output video, in microseconds. */ public final long durationUs; + /** The frame rate of the image in the output video, in frames per second. */ @IntRange(from = 0) public final int frameRate; + /** The {@link Effects} to apply to the {@link #mediaItem}. */ public final Effects effects; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItemSequence.java b/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItemSequence.java index 354db579c3..fd7e8674bf 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItemSequence.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItemSequence.java @@ -35,6 +35,7 @@ public final class EditedMediaItemSequence { *

This list must not be empty. */ public final ImmutableList editedMediaItems; + /** * Whether this sequence is looping. * diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/Effects.java b/libraries/transformer/src/main/java/androidx/media3/transformer/Effects.java index 052cfa6e72..ec597ed31b 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/Effects.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/Effects.java @@ -37,6 +37,7 @@ public final class Effects { * AudioProcessor} if it {@link AudioProcessor#isActive()} based on the current configuration. */ public final ImmutableList audioProcessors; + /** * The list of {@linkplain Effect video effects} to apply to each frame. They are applied in the * order of the list. diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/ExportException.java b/libraries/transformer/src/main/java/androidx/media3/transformer/ExportException.java index 5d5d32b6b1..73ec7aa385 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/ExportException.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/ExportException.java @@ -77,6 +77,7 @@ public final class ExportException extends Exception { /** Caused by an error whose cause could not be identified. */ public static final int ERROR_CODE_UNSPECIFIED = 1000; + /** * Caused by a failed runtime check. * @@ -88,6 +89,7 @@ public final class ExportException extends Exception { /** Caused by an Input/Output error which could not be identified. */ public static final int ERROR_CODE_IO_UNSPECIFIED = 2000; + /** * Caused by a network connection failure. * @@ -101,8 +103,10 @@ public final class ExportException extends Exception { * */ public static final int ERROR_CODE_IO_NETWORK_CONNECTION_FAILED = 2001; + /** Caused by a network timeout, meaning the server is taking too long to fulfill a request. */ public static final int ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT = 2002; + /** * Caused by a server returning a resource with an invalid "Content-Type" HTTP header value. * @@ -110,20 +114,25 @@ public final class ExportException extends Exception { * the server returns a paywall HTML page, with content type "text/html". */ public static final int ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE = 2003; + /** Caused by an HTTP server returning an unexpected HTTP response status code. */ public static final int ERROR_CODE_IO_BAD_HTTP_STATUS = 2004; + /** Caused by a non-existent file. */ public static final int ERROR_CODE_IO_FILE_NOT_FOUND = 2005; + /** * Caused by lack of permission to perform an IO operation. For example, lack of permission to * access internet or external storage. */ public static final int ERROR_CODE_IO_NO_PERMISSION = 2006; + /** * Caused by the {@link AssetLoader} trying to access cleartext HTTP traffic (meaning http:// * rather than https://) when the app's Network Security Configuration does not permit it. */ public static final int ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED = 2007; + /** Caused by reading data out of the data bound. */ public static final int ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE = 2008; @@ -131,8 +140,10 @@ public final class ExportException extends Exception { /** Caused by a decoder initialization failure. */ public static final int ERROR_CODE_DECODER_INIT_FAILED = 3001; + /** Caused by a failure while trying to decode media samples. */ public static final int ERROR_CODE_DECODING_FAILED = 3002; + /** Caused by trying to decode content whose format is not supported. */ public static final int ERROR_CODE_DECODING_FORMAT_UNSUPPORTED = 3003; @@ -140,8 +151,10 @@ public final class ExportException extends Exception { /** Caused by an encoder initialization failure. */ public static final int ERROR_CODE_ENCODER_INIT_FAILED = 4001; + /** Caused by a failure while trying to encode media samples. */ public static final int ERROR_CODE_ENCODING_FAILED = 4002; + /** * Caused by trying to encode content whose format is not supported. * * @@ -164,6 +177,7 @@ public final class ExportException extends Exception { /** Caused by a failure while muxing media samples. */ public static final int ERROR_CODE_MUXING_FAILED = 7001; + /** * Caused by a timeout while muxing media samples. * diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/ExportResult.java b/libraries/transformer/src/main/java/androidx/media3/transformer/ExportResult.java index 1e74ec55cd..c88c118492 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/ExportResult.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/ExportResult.java @@ -227,11 +227,13 @@ public final class ExportResult { public static final class ProcessedInput { /** The processed {@link MediaItem}. */ public final MediaItem mediaItem; + /** * The name of the audio decoder used to process {@code mediaItem}. This field is {@code null} * if no audio decoder was used. */ public final @MonotonicNonNull String audioDecoderName; + /** * The name of the video decoder used to process {@code mediaItem}. This field is {@code null} * if no video decoder was used. @@ -252,6 +254,7 @@ public final class ExportResult { /** The duration of the file in milliseconds, or {@link C#TIME_UNSET} if unset or unknown. */ public final long durationMs; + /** The size of the file in bytes, or {@link C#LENGTH_UNSET} if unset or unknown. */ public final long fileSizeBytes; @@ -259,10 +262,13 @@ public final class ExportResult { * The average bitrate of the audio track data, or {@link C#RATE_UNSET_INT} if unset or unknown. */ public final int averageAudioBitrate; + /** The channel count of the audio, or {@link C#LENGTH_UNSET} if unset or unknown. */ public final int channelCount; + /** The sample rate of the audio, or {@link C#RATE_UNSET_INT} if unset or unknown. */ public final int sampleRate; + /** The name of the audio encoder used, or {@code null} if none were used. */ @Nullable public final String audioEncoderName; @@ -270,14 +276,19 @@ public final class ExportResult { * The average bitrate of the video track data, or {@link C#RATE_UNSET_INT} if unset or unknown. */ public final int averageVideoBitrate; + /** The {@link ColorInfo} of the video, or {@code null} if unset or unknown. */ @Nullable public final ColorInfo colorInfo; + /** The height of the video, or {@link C#LENGTH_UNSET} if unset or unknown. */ public final int height; + /** The width of the video, or {@link C#LENGTH_UNSET} if unset or unknown. */ public final int width; + /** The number of video frames. */ public final int videoFrameCount; + /** The name of the video encoder used, or {@code null} if none were used. */ @Nullable public final String videoEncoderName; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SefSlowMotionFlattener.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SefSlowMotionFlattener.java index 5499da5c58..6c33a03589 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SefSlowMotionFlattener.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SefSlowMotionFlattener.java @@ -66,6 +66,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private static final int TARGET_OUTPUT_FRAME_RATE = 30; private static final int NAL_START_CODE_LENGTH = NAL_START_CODE.length; + /** * The nal_unit_type corresponding to a prefix NAL unit (see ITU-T Recommendation H.264 (2016) * table 7-1). @@ -73,17 +74,22 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private static final int NAL_UNIT_TYPE_PREFIX = 0x0E; private final byte[] scratch; + /** The SEF slow motion configuration of the input. */ @Nullable private final SlowMotionData slowMotionData; + /** * An iterator iterating over the slow motion segments, pointing at the segment following {@code * nextSegmentInfo}, if any. */ private final Iterator segmentIterator; + /** The frame rate at which the input has been captured, in fps. */ private final float captureFrameRate; + /** The maximum SVC temporal layer present in the input. */ private final int inputMaxLayer; + /** * The maximum SVC temporal layer value of the frames that should be kept in the input (or a part * of it) so that it is played at normal speed. @@ -95,16 +101,19 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; * frame is not in such a segment. */ @Nullable private SegmentInfo currentSegmentInfo; + /** * The {@link SegmentInfo} describing the slow motion segment following (not including) the * current frame, or null if there is no such segment. */ @Nullable private SegmentInfo nextSegmentInfo; + /** * The time delta to be added to the output timestamps before scaling to take the slow motion * segments into account, in microseconds. */ private long frameTimeDeltaUs; + /** * The presentation time for the last {@linkplain #dropOrTransformSample(ByteBuffer, long) * processed sample}. @@ -332,15 +341,18 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; * C#RATE_UNSET} if it is unknown or invalid. */ public float captureFrameRate; + /** * The maximum SVC layer value of the input frames, or {@link C#INDEX_UNSET} if it is unknown. */ public int inputMaxLayer; + /** * The maximum SVC layer value of the frames to keep in order to play the video at normal speed * at {@link #TARGET_OUTPUT_FRAME_RATE}, or {@link C#INDEX_UNSET} if it is unknown. */ public int normalSpeedMaxLayer; + /** The input {@link SlowMotionData}. */ @Nullable public SlowMotionData slowMotionData; @@ -355,14 +367,17 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private static final class SegmentInfo { /** The segment start time, in microseconds. */ public final long startTimeUs; + /** The segment end time, in microseconds. */ public final long endTimeUs; + /** * The segment speedDivisor. * * @see SlowMotionData.Segment#speedDivisor */ public final int speedDivisor; + /** * The maximum SVC layer value of the frames to keep in the segment in order to slow down the * segment by {@code speedDivisor}. diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SequenceAssetLoader.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SequenceAssetLoader.java index 26b3447ed7..a746b265f9 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SequenceAssetLoader.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SequenceAssetLoader.java @@ -62,6 +62,7 @@ import java.util.concurrent.atomic.AtomicInteger; private final AssetLoader.Factory assetLoaderFactory; private final HandlerWrapper handler; private final Listener sequenceAssetLoaderListener; + /** * A mapping from track types to {@link SampleConsumer} instances. * @@ -69,6 +70,7 @@ import java.util.concurrent.atomic.AtomicInteger; * video. */ private final Map sampleConsumersByTrackType; + /** * A mapping from track types to {@link OnMediaItemChangedListener} instances. * diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationException.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationException.java index c575c5c873..b9e2a4a28b 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationException.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationException.java @@ -79,6 +79,7 @@ public final class TransformationException extends Exception { /** Caused by an error whose cause could not be identified. */ public static final int ERROR_CODE_UNSPECIFIED = 1000; + /** * Caused by a failed runtime check. * @@ -90,6 +91,7 @@ public final class TransformationException extends Exception { /** Caused by an Input/Output error which could not be identified. */ public static final int ERROR_CODE_IO_UNSPECIFIED = 2000; + /** * Caused by a network connection failure. * @@ -103,8 +105,10 @@ public final class TransformationException extends Exception { * */ public static final int ERROR_CODE_IO_NETWORK_CONNECTION_FAILED = 2001; + /** Caused by a network timeout, meaning the server is taking too long to fulfill a request. */ public static final int ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT = 2002; + /** * Caused by a server returning a resource with an invalid "Content-Type" HTTP header value. * @@ -112,20 +116,25 @@ public final class TransformationException extends Exception { * the server returns a paywall HTML page, with content type "text/html". */ public static final int ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE = 2003; + /** Caused by an HTTP server returning an unexpected HTTP response status code. */ public static final int ERROR_CODE_IO_BAD_HTTP_STATUS = 2004; + /** Caused by a non-existent file. */ public static final int ERROR_CODE_IO_FILE_NOT_FOUND = 2005; + /** * Caused by lack of permission to perform an IO operation. For example, lack of permission to * access internet or external storage. */ public static final int ERROR_CODE_IO_NO_PERMISSION = 2006; + /** * Caused by the {@link AssetLoader} trying to access cleartext HTTP traffic (meaning http:// * rather than https://) when the app's Network Security Configuration does not permit it. */ public static final int ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED = 2007; + /** Caused by reading data out of the data bound. */ public static final int ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE = 2008; @@ -133,8 +142,10 @@ public final class TransformationException extends Exception { /** Caused by a decoder initialization failure. */ public static final int ERROR_CODE_DECODER_INIT_FAILED = 3001; + /** Caused by a failure while trying to decode media samples. */ public static final int ERROR_CODE_DECODING_FAILED = 3002; + /** Caused by trying to decode content whose format is not supported. */ public static final int ERROR_CODE_DECODING_FORMAT_UNSUPPORTED = 3003; @@ -142,8 +153,10 @@ public final class TransformationException extends Exception { /** Caused by an encoder initialization failure. */ public static final int ERROR_CODE_ENCODER_INIT_FAILED = 4001; + /** Caused by a failure while trying to encode media samples. */ public static final int ERROR_CODE_ENCODING_FAILED = 4002; + /** * Caused by trying to encode content whose format is not supported. * * diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationRequest.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationRequest.java index 824c978dc0..a5784fc976 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationRequest.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationRequest.java @@ -54,6 +54,7 @@ public final class TransformationRequest { HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR, }) public @interface HdrMode {} + /** * Processes HDR input as HDR, to generate HDR output. * @@ -65,6 +66,7 @@ public final class TransformationRequest { * #HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC}. */ public static final int HDR_MODE_KEEP_HDR = 0; + /** * Tone map HDR input to SDR before processing, to generate SDR output, using the {@link * android.media.MediaCodec} decoder tone-mapper. @@ -75,6 +77,7 @@ public final class TransformationRequest { *

If not supported, {@link Transformer} throws an {@link ExportException}. */ public static final int HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC = 1; + /** * Tone map HDR input to SDR before processing, to generate SDR output, using an OpenGL * tone-mapper. @@ -89,6 +92,7 @@ public final class TransformationRequest { *

If not supported, {@link Transformer} throws an {@link ExportException}. */ public static final int HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL = 2; + /** * Interpret HDR input as SDR, likely with a washed out look. * @@ -254,6 +258,7 @@ public final class TransformationRequest { * */ public final int outputHeight; + /** * The requested output audio sample {@linkplain MimeTypes MIME type}, or {@code null} if inferred * from the input. @@ -261,6 +266,7 @@ public final class TransformationRequest { * @see Builder#setAudioMimeType(String) */ @Nullable public final String audioMimeType; + /** * The requested output video sample {@linkplain MimeTypes MIME type}, or {@code null} if inferred * from the input. @@ -268,6 +274,7 @@ public final class TransformationRequest { * @see Builder#setVideoMimeType(String) */ @Nullable public final String videoMimeType; + /** * The {@link HdrMode} specifying how to handle HDR input video. * diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationResult.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationResult.java index e336a55603..9037261262 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationResult.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationResult.java @@ -266,11 +266,13 @@ public final class TransformationResult { public static final class ProcessedInput { /** The processed {@link MediaItem}. */ public final MediaItem mediaItem; + /** * The name of the audio decoder used to process {@code mediaItem}. This field is {@code null} * if no audio decoder was used. */ public final @MonotonicNonNull String audioDecoderName; + /** * The name of the video decoder used to process {@code mediaItem}. This field is {@code null} * if no video decoder was used. @@ -291,6 +293,7 @@ public final class TransformationResult { /** The duration of the file in milliseconds, or {@link C#TIME_UNSET} if unset or unknown. */ public final long durationMs; + /** The size of the file in bytes, or {@link C#LENGTH_UNSET} if unset or unknown. */ public final long fileSizeBytes; @@ -298,10 +301,13 @@ public final class TransformationResult { * The average bitrate of the audio track data, or {@link C#RATE_UNSET_INT} if unset or unknown. */ public final int averageAudioBitrate; + /** The channel count of the audio, or {@link C#LENGTH_UNSET} if unset or unknown. */ public final int channelCount; + /** The sample rate of the audio, or {@link C#RATE_UNSET_INT} if unset or unknown. */ public final int sampleRate; + /** The name of the audio encoder used, or {@code null} if none were used. */ @Nullable public final String audioEncoderName; @@ -309,14 +315,19 @@ public final class TransformationResult { * The average bitrate of the video track data, or {@link C#RATE_UNSET_INT} if unset or unknown. */ public final int averageVideoBitrate; + /** The {@link ColorInfo} of the video, or {@code null} if unset or unknown. */ @Nullable public final ColorInfo colorInfo; + /** The height of the video, or {@link C#LENGTH_UNSET} if unset or unknown. */ public final int height; + /** The width of the video, or {@link C#LENGTH_UNSET} if unset or unknown. */ public final int width; + /** The number of video frames. */ public final int videoFrameCount; + /** The name of the video encoder used, or {@code null} if none were used. */ @Nullable public final String videoEncoderName; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java index a4e0aa70e1..9f58c4572c 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java @@ -543,16 +543,21 @@ public final class Transformer { PROGRESS_STATE_UNAVAILABLE }) public @interface ProgressState {} + /** Indicates that the corresponding operation hasn't been started. */ public static final int PROGRESS_STATE_NOT_STARTED = 0; + /** * @deprecated Use {@link #PROGRESS_STATE_NOT_STARTED} instead. */ @Deprecated public static final int PROGRESS_STATE_NO_TRANSFORMATION = PROGRESS_STATE_NOT_STARTED; + /** Indicates that the progress is currently unavailable, but might become available. */ public static final int PROGRESS_STATE_WAITING_FOR_AVAILABILITY = 1; + /** Indicates that the progress is available. */ public static final int PROGRESS_STATE_AVAILABLE = 2; + /** Indicates that the progress is permanently unavailable. */ public static final int PROGRESS_STATE_UNAVAILABLE = 3; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java index 7b691bf947..8dedc7f68c 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java @@ -80,10 +80,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @Target(TYPE_USE) @IntDef({END_REASON_COMPLETED, END_REASON_CANCELLED, END_REASON_ERROR}) private @interface EndReason {} + /** The export completed successfully. */ private static final int END_REASON_COMPLETED = 0; + /** The export was cancelled. */ private static final int END_REASON_CANCELLED = 1; + /** An error occurred during the export. */ private static final int END_REASON_ERROR = 2; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoEncoderSettings.java b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoEncoderSettings.java index 1806e8e12e..ced51358cd 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoEncoderSettings.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoEncoderSettings.java @@ -42,6 +42,7 @@ public final class VideoEncoderSettings { /** A value for various fields to indicate that the field's value is unknown or not applicable. */ public static final int NO_VALUE = Format.NO_VALUE; + /** The default I-frame interval in seconds. */ public static final float DEFAULT_I_FRAME_INTERVAL_SECONDS = 1.0f; @@ -219,18 +220,25 @@ public final class VideoEncoderSettings { /** The encoding bitrate in bits per second. */ public final int bitrate; + /** One of {@linkplain BitrateMode}. */ public final @BitrateMode int bitrateMode; + /** The encoding profile. */ public final int profile; + /** The encoding level. */ public final int level; + /** The encoding I-Frame interval in seconds. */ public final float iFrameIntervalSeconds; + /** The encoder {@link MediaFormat#KEY_OPERATING_RATE operating rate} in frames per second. */ public final int operatingRate; + /** The encoder {@link MediaFormat#KEY_PRIORITY priority}. */ public final int priority; + /** Whether the encoder should automatically set the bitrate to target a high quality encoding. */ public final boolean enableHighQualityTargeting; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSamplePipeline.java b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSamplePipeline.java index 8d57fee861..5d6546d302 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSamplePipeline.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSamplePipeline.java @@ -76,6 +76,7 @@ import org.checkerframework.dataflow.qual.Pure; @Nullable final Presentation presentation; private volatile boolean encoderExpectsTimestampZero; + /** * The timestamp of the last buffer processed before {@linkplain * VideoFrameProcessor.Listener#onEnded() frame processing has ended}. diff --git a/libraries/ui/src/main/java/androidx/media3/ui/AspectRatioFrameLayout.java b/libraries/ui/src/main/java/androidx/media3/ui/AspectRatioFrameLayout.java index c851dd4312..539e8b0f71 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/AspectRatioFrameLayout.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/AspectRatioFrameLayout.java @@ -68,16 +68,20 @@ public final class AspectRatioFrameLayout extends FrameLayout { /** Either the width or height is decreased to obtain the desired aspect ratio. */ public static final int RESIZE_MODE_FIT = 0; + /** * The width is fixed and the height is increased or decreased to obtain the desired aspect ratio. */ public static final int RESIZE_MODE_FIXED_WIDTH = 1; + /** * The height is fixed and the width is increased or decreased to obtain the desired aspect ratio. */ public static final int RESIZE_MODE_FIXED_HEIGHT = 2; + /** The specified aspect ratio is ignored. */ public static final int RESIZE_MODE_FILL = 3; + /** Either the width or height is increased to obtain the desired aspect ratio. */ public static final int RESIZE_MODE_ZOOM = 4; diff --git a/libraries/ui/src/main/java/androidx/media3/ui/CaptionStyleCompat.java b/libraries/ui/src/main/java/androidx/media3/ui/CaptionStyleCompat.java index 531084cccd..3f1e8507aa 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/CaptionStyleCompat.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/CaptionStyleCompat.java @@ -51,14 +51,19 @@ public final class CaptionStyleCompat { EDGE_TYPE_DEPRESSED }) public @interface EdgeType {} + /** Edge type value specifying no character edges. */ public static final int EDGE_TYPE_NONE = 0; + /** Edge type value specifying uniformly outlined character edges. */ public static final int EDGE_TYPE_OUTLINE = 1; + /** Edge type value specifying drop-shadowed character edges. */ public static final int EDGE_TYPE_DROP_SHADOW = 2; + /** Edge type value specifying raised bevel character edges. */ public static final int EDGE_TYPE_RAISED = 3; + /** Edge type value specifying depressed bevel character edges. */ public static final int EDGE_TYPE_DEPRESSED = 4; diff --git a/libraries/ui/src/main/java/androidx/media3/ui/DefaultTimeBar.java b/libraries/ui/src/main/java/androidx/media3/ui/DefaultTimeBar.java index 4aec163bfa..692132441e 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/DefaultTimeBar.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/DefaultTimeBar.java @@ -131,38 +131,52 @@ public class DefaultTimeBar extends View implements TimeBar { /** Default height for the time bar, in dp. */ public static final int DEFAULT_BAR_HEIGHT_DP = 4; + /** Default height for the touch target, in dp. */ public static final int DEFAULT_TOUCH_TARGET_HEIGHT_DP = 26; + /** Default width for ad markers, in dp. */ public static final int DEFAULT_AD_MARKER_WIDTH_DP = 4; + /** Default diameter for the scrubber when enabled, in dp. */ public static final int DEFAULT_SCRUBBER_ENABLED_SIZE_DP = 12; + /** Default diameter for the scrubber when disabled, in dp. */ public static final int DEFAULT_SCRUBBER_DISABLED_SIZE_DP = 0; + /** Default diameter for the scrubber when dragged, in dp. */ public static final int DEFAULT_SCRUBBER_DRAGGED_SIZE_DP = 16; + /** Default color for the played portion of the time bar. */ public static final int DEFAULT_PLAYED_COLOR = 0xFFFFFFFF; + /** Default color for the unplayed portion of the time bar. */ public static final int DEFAULT_UNPLAYED_COLOR = 0x33FFFFFF; + /** Default color for the buffered portion of the time bar. */ public static final int DEFAULT_BUFFERED_COLOR = 0xCCFFFFFF; + /** Default color for the scrubber handle. */ public static final int DEFAULT_SCRUBBER_COLOR = 0xFFFFFFFF; + /** Default color for ad markers. */ public static final int DEFAULT_AD_MARKER_COLOR = 0xB2FFFF00; + /** Default color for played ad markers. */ public static final int DEFAULT_PLAYED_AD_MARKER_COLOR = 0x33FFFF00; /** Vertical gravity for progress bar to be located at the center in the view. */ public static final int BAR_GRAVITY_CENTER = 0; + /** Vertical gravity for progress bar to be located at the bottom in the view. */ public static final int BAR_GRAVITY_BOTTOM = 1; /** The threshold in dps above the bar at which touch events trigger fine scrub mode. */ private static final int FINE_SCRUB_Y_THRESHOLD_DP = -50; + /** The ratio by which times are reduced in fine scrub mode. */ private static final int FINE_SCRUB_RATIO = 3; + /** * The time after which the scrubbing listener is notified that scrubbing has stopped after * performing an incremental scrub using key input. diff --git a/libraries/ui/src/main/java/androidx/media3/ui/LegacyPlayerControlView.java b/libraries/ui/src/main/java/androidx/media3/ui/LegacyPlayerControlView.java index 3a7649a027..1e14fa5afa 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/LegacyPlayerControlView.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/LegacyPlayerControlView.java @@ -277,11 +277,14 @@ public class LegacyPlayerControlView extends FrameLayout { /** The default show timeout, in milliseconds. */ public static final int DEFAULT_SHOW_TIMEOUT_MS = 5000; + /** The default repeat toggle modes. */ public static final @RepeatModeUtil.RepeatToggleModes int DEFAULT_REPEAT_TOGGLE_MODES = RepeatModeUtil.REPEAT_TOGGLE_MODE_NONE; + /** The default minimum interval between time bar position updates. */ public static final int DEFAULT_TIME_BAR_MIN_UPDATE_INTERVAL_MS = 200; + /** The maximum number of windows that can be shown in a multi-window time bar. */ public static final int MAX_WINDOWS_FOR_MULTI_WINDOW_TIME_BAR = 100; diff --git a/libraries/ui/src/main/java/androidx/media3/ui/PlayerControlView.java b/libraries/ui/src/main/java/androidx/media3/ui/PlayerControlView.java index edec2cbfac..eb13af7cf6 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/PlayerControlView.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/PlayerControlView.java @@ -244,15 +244,20 @@ public class PlayerControlView extends FrameLayout { /** The default show timeout, in milliseconds. */ public static final int DEFAULT_SHOW_TIMEOUT_MS = 5_000; + /** The default repeat toggle modes. */ public static final @RepeatModeUtil.RepeatToggleModes int DEFAULT_REPEAT_TOGGLE_MODES = RepeatModeUtil.REPEAT_TOGGLE_MODE_NONE; + /** The default minimum interval between time bar position updates. */ public static final int DEFAULT_TIME_BAR_MIN_UPDATE_INTERVAL_MS = 200; + /** The maximum number of windows that can be shown in a multi-window time bar. */ public static final int MAX_WINDOWS_FOR_MULTI_WINDOW_TIME_BAR = 100; + /** The maximum interval between time bar position updates. */ private static final int MAX_UPDATE_INTERVAL_MS = 1_000; + // LINT.IfChange(playback_speeds) private static final float[] PLAYBACK_SPEEDS = new float[] {0.25f, 0.5f, 0.75f, 1f, 1.25f, 1.5f, 2f}; diff --git a/libraries/ui/src/main/java/androidx/media3/ui/PlayerNotificationManager.java b/libraries/ui/src/main/java/androidx/media3/ui/PlayerNotificationManager.java index f3860ce962..fb99b3d88b 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/PlayerNotificationManager.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/PlayerNotificationManager.java @@ -613,20 +613,28 @@ public class PlayerNotificationManager { /** The action which starts playback. */ public static final String ACTION_PLAY = "androidx.media3.ui.notification.play"; + /** The action which pauses playback. */ public static final String ACTION_PAUSE = "androidx.media3.ui.notification.pause"; + /** The action which skips to the previous media item. */ public static final String ACTION_PREVIOUS = "androidx.media3.ui.notification.prev"; + /** The action which skips to the next media item. */ public static final String ACTION_NEXT = "androidx.media3.ui.notification.next"; + /** The action which fast forwards. */ public static final String ACTION_FAST_FORWARD = "androidx.media3.ui.notification.ffwd"; + /** The action which rewinds. */ public static final String ACTION_REWIND = "androidx.media3.ui.notification.rewind"; + /** The action which stops playback. */ public static final String ACTION_STOP = "androidx.media3.ui.notification.stop"; + /** The extra key of the instance id of the player notification manager. */ public static final String EXTRA_INSTANCE_ID = "INSTANCE_ID"; + /** * The action which is executed when the notification is dismissed. It cancels the notification * and calls {@link NotificationListener#onNotificationCancelled(int, boolean)}. diff --git a/libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java b/libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java index 76de29aba2..3a9a2a0d35 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java @@ -215,8 +215,10 @@ public class PlayerView extends FrameLayout implements AdViewProvider { /** No artwork is shown. */ @UnstableApi public static final int ARTWORK_DISPLAY_MODE_OFF = 0; + /** The artwork is fit into the player view and centered creating a letterbox style. */ @UnstableApi public static final int ARTWORK_DISPLAY_MODE_FIT = 1; + /** * The artwork covers the entire space of the player view. If the aspect ratio of the image is * different than the player view some areas of the image are cropped. @@ -233,13 +235,16 @@ public class PlayerView extends FrameLayout implements AdViewProvider { @Target(TYPE_USE) @IntDef({SHOW_BUFFERING_NEVER, SHOW_BUFFERING_WHEN_PLAYING, SHOW_BUFFERING_ALWAYS}) public @interface ShowBuffering {} + /** The buffering view is never shown. */ @UnstableApi public static final int SHOW_BUFFERING_NEVER = 0; + /** * The buffering view is shown when the player is in the {@link Player#STATE_BUFFERING buffering} * state and {@link Player#getPlayWhenReady() playWhenReady} is {@code true}. */ @UnstableApi public static final int SHOW_BUFFERING_WHEN_PLAYING = 1; + /** * The buffering view is always shown when the player is in the {@link Player#STATE_BUFFERING * buffering} state.