From 9b94cd2b37e7185e3723e76aa647f6b1bbc76bef Mon Sep 17 00:00:00 2001 From: Andrew Lewis Date: Tue, 14 Mar 2023 10:19:30 +0000 Subject: [PATCH 1/8] Shorten labels to fix transformer demo UI --- demos/transformer/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demos/transformer/src/main/res/values/strings.xml b/demos/transformer/src/main/res/values/strings.xml index 6f26949a591..cae40d8b3b5 100644 --- a/demos/transformer/src/main/res/values/strings.xml +++ b/demos/transformer/src/main/res/values/strings.xml @@ -31,8 +31,8 @@ Enable debug preview Trim Request SDR tone-mapping (API 31+) - [Experimental] Force interpret HDR video as SDR (API 29+) - [Experimental] HDR editing (API 31+) + Interpret HDR as SDR (API 29+) + HDR editing (API 31+) Add demo effects Periodic vignette options Failed to load MediaPipe processor. Check the README for instructions. From c3be596c1f3c3084dced3acb92fa00c6bae1a651 Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 3 Mar 2023 17:38:11 +0000 Subject: [PATCH 2/8] Remove references to MetadataOutput from dev guide This is now a much more 'internal' component, and there's no way to register one directly on a `Player` instance. Issue: androidx/media#258 #minor-release PiperOrigin-RevId: 513849776 (cherry picked from commit abcb8061b7ace8c57a847e46c175641201898484) --- docs/ad-insertion.md | 6 +++--- docs/retrieving-metadata.md | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/ad-insertion.md b/docs/ad-insertion.md index 9f6e9df88b5..649ee36ddbe 100644 --- a/docs/ad-insertion.md +++ b/docs/ad-insertion.md @@ -310,9 +310,9 @@ metadata. Often, server-side inserted ad streams contain timed events to notify the player about ad metadata. Please see [supported formats][] for information on what -timed metadata formats are supported by ExoPlayer. Custom ads SDK `MediaSource`s -can listen for timed metadata events from the player, e.g., via -`ExoPlayer.addMetadataOutput`. +timed metadata formats are supported by ExoPlayer. Custom ads SDK `MediaSource` +implementations can listen for timed metadata events from the player via +`Player.Listener.onMetadata`. [VAST]: https://www.iab.com/wp-content/uploads/2015/06/VASTv3_0.pdf [VMAP]: https://www.iab.com/guidelines/digital-video-multiple-ad-playlist-vmap-1-0-1/ diff --git a/docs/retrieving-metadata.md b/docs/retrieving-metadata.md index c718baae7ee..30d18f3fed2 100644 --- a/docs/retrieving-metadata.md +++ b/docs/retrieving-metadata.md @@ -22,10 +22,10 @@ public void onMediaMetadataChanged(MediaMetadata mediaMetadata) { {: .language-java} If an application needs access to specific [`Metadata.Entry`][] objects, then it -should add a `MetadataOutput` (for dynamic metadata delivered during -playback) to the player. Alternatively, if there is a need to look at static -metadata, this can be accessed through the `TrackSelections#getFormat`. Both of -these options are used to populate the `Player#getMediaMetadata`. +should listen to `Player.Listener#onMetadata` (for dynamic metadata delivered +during playback). Alternatively, if there is a need to look at static metadata, +this can be accessed through the `TrackSelections#getFormat`. +`Player#getMediaMetadata` is populated from both of these sources. ## Without playback ## From 489188b35ca4eea759467d2ded0b13e1a46e9f79 Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 3 Mar 2023 19:08:33 +0000 Subject: [PATCH 3/8] Add missing `@param` tags Dackka generates a warning if a method has at least one `@param` tag, but not all of them are documented. PiperOrigin-RevId: 513873453 (cherry picked from commit d67c869378dafc00aa519df42401e54eea5d4139) --- .../main/java/com/google/android/exoplayer2/Timeline.java | 1 + .../main/java/com/google/android/exoplayer2/Tracks.java | 1 + .../main/java/com/google/android/exoplayer2/util/Util.java | 1 + .../google/android/exoplayer2/ExoPlaybackException.java | 2 ++ .../android/exoplayer2/drm/OfflineLicenseHelper.java | 1 + .../android/exoplayer2/mediacodec/MediaCodecRenderer.java | 1 + .../android/exoplayer2/offline/SegmentDownloader.java | 1 + .../exoplayer2/trackselection/DefaultTrackSelector.java | 1 + .../exoplayer2/trackselection/MappingTrackSelector.java | 1 + .../exoplayer2/trackselection/RandomTrackSelection.java | 5 ++++- .../android/exoplayer2/video/DecoderVideoRenderer.java | 1 + .../android/exoplayer2/source/dash/DashChunkSource.java | 5 ++++- .../google/android/exoplayer2/upstream/DataSourceUtil.java | 1 + .../android/exoplayer2/upstream/DefaultDataSource.java | 1 + .../google/android/exoplayer2/effect/BitmapTestUtil.java | 2 ++ .../android/exoplayer2/extractor/FlacFrameReader.java | 1 + .../android/exoplayer2/text/webvtt/WebvttCssStyle.java | 3 ++- .../android/exoplayer2/source/hls/HlsMediaPeriod.java | 4 ++++ .../exoplayer2/source/hls/playlist/HlsMediaPlaylist.java | 4 ++++ .../com/google/android/exoplayer2/testutil/Action.java | 3 +++ .../google/android/exoplayer2/testutil/ActionSchedule.java | 7 +++++-- .../android/exoplayer2/testutil/ExtractorAsserts.java | 3 +++ .../android/exoplayer2/testutil/FakeMediaPeriod.java | 1 + .../android/exoplayer2/testutil/FakeMediaSource.java | 1 + .../google/android/exoplayer2/testutil/FakeTimeline.java | 3 +++ .../android/exoplayer2/testutil/MediaSourceTestRunner.java | 1 + .../android/exoplayer2/testutil/TimelineAsserts.java | 1 + 27 files changed, 52 insertions(+), 5 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Timeline.java b/library/common/src/main/java/com/google/android/exoplayer2/Timeline.java index 6fb855cc252..209b1de832b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Timeline.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Timeline.java @@ -809,6 +809,7 @@ public long getAdDurationUs(int adGroupIndex, int adIndexInAdGroup) { * adGroupIndex}, or {@link AdPlaybackState#AD_STATE_UNAVAILABLE} if not yet known. * * @param adGroupIndex The ad group index. + * @param adIndexInAdGroup The index of the ad in the ad group. * @return The state of the ad, or {@link AdPlaybackState#AD_STATE_UNAVAILABLE} if not yet * known. */ diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Tracks.java b/library/common/src/main/java/com/google/android/exoplayer2/Tracks.java index ed7ff22822d..b88ab1c2cef 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Tracks.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Tracks.java @@ -293,6 +293,7 @@ public boolean isTypeSupported(@C.TrackType int trackType) { * Returns true if at least one track of type {@code trackType} is {@link * Group#isTrackSupported(int, boolean) supported}. * + * @param trackType The track type to query support for. * @param allowExceedsCapabilities Whether to consider the track as supported if it has a * supported {@link Format#sampleMimeType MIME type}, but otherwise exceeds the advertised * capabilities of the device. For example, a video track for which there's a corresponding diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java b/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java index 5607d8c3936..e6ee66cffd4 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java @@ -1490,6 +1490,7 @@ public static long getMediaDurationForPlayoutDuration(long playoutDuration, floa * Returns the playout duration of {@code mediaDuration} of media. * * @param mediaDuration The duration to scale. + * @param speed The factor by which playback is sped up. * @return The scaled duration, in the same units as {@code mediaDuration}. */ public static long getPlayoutDurationForMediaDuration(long mediaDuration, float speed) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlaybackException.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlaybackException.java index 1fd94479b81..dce2112307d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlaybackException.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlaybackException.java @@ -125,6 +125,8 @@ public static ExoPlaybackException createForSource(IOException cause, int errorC * Creates an instance of type {@link #TYPE_RENDERER}. * * @param cause The cause of the failure. + * @param rendererName The {@linkplain Renderer#getName() name} of the renderer in which the + * failure occurred. * @param rendererIndex The index of the renderer in which the failure occurred. * @param rendererFormat The {@link Format} the renderer was using at the time of the exception, * or null if the renderer wasn't using a {@link Format}. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/OfflineLicenseHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/OfflineLicenseHelper.java index 7bc885a383c..c1d1b907d1e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/OfflineLicenseHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/OfflineLicenseHelper.java @@ -97,6 +97,7 @@ public static OfflineLicenseHelper newWidevineInstance( * their own license URL. * @param forceDefaultLicenseUrl Whether to use {@code defaultLicenseUrl} for key requests that * include their own license URL. + * @param dataSourceFactory A factory from which to obtain {@link DataSource} instances. * @param optionalKeyRequestParameters An optional map of parameters to pass as the last argument * to {@link MediaDrm#getKeyRequest}. May be null. * @param eventDispatcher A {@link DrmSessionEventListener.EventDispatcher} used to distribute diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java index 8d746f16509..0fc528bd69b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java @@ -360,6 +360,7 @@ private static String buildCustomDiagnosticInfo(int errorCode) { /** * @param trackType The {@link C.TrackType track type} that the renderer handles. + * @param codecAdapterFactory A factory for {@link MediaCodecAdapter} instances. * @param mediaCodecSelector A decoder selector. * @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder * initialization fails. This may result in using a decoder that is less efficient or slower diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/SegmentDownloader.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/SegmentDownloader.java index ef47bf0c17e..3b134ebcd54 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/SegmentDownloader.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/SegmentDownloader.java @@ -323,6 +323,7 @@ public final void remove() { /** * Loads and parses a manifest. * + * @param dataSource The source to use when loading the manifest. * @param dataSpec The manifest {@link DataSpec}. * @param removing Whether the manifest is being loaded as part of the download being removed. * @return The loaded manifest. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java index 786f7898570..9dd51951f1e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java @@ -2439,6 +2439,7 @@ private void setParametersInternal(Parameters parameters) { * renderer, track group and track (in that order). * @param rendererMixedMimeTypeAdaptationSupports The {@link AdaptiveSupport} for mixed MIME type * adaptation for the renderer. + * @param params The parameters to use for the track selection. * @return The {@link ExoTrackSelection.Definition}s for the renderers. A null entry indicates no * selection was made. * @throws ExoPlaybackException If an error occurs while selecting the tracks. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java index eb252ddf054..e482ac4210a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java @@ -287,6 +287,7 @@ public TrackGroupArray getTrackGroups(int rendererIndex) { * * @param rendererIndex The renderer index. * @param groupIndex The index of the track group. + * @param trackIndices The indices of the tracks in the track group for which to query support. * @return The {@link AdaptiveSupport}. */ public @AdaptiveSupport int getAdaptiveSupport( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/RandomTrackSelection.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/RandomTrackSelection.java index f2c13ba9c01..fd8023ca000 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/RandomTrackSelection.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/RandomTrackSelection.java @@ -66,12 +66,15 @@ public Factory(int seed) { private int selectedIndex; /** + * Creates a new instance. + * * @param group The {@link TrackGroup}. Must not be null. * @param tracks The indices of the selected tracks within the {@link TrackGroup}. Must not be * null or empty. May be in any order. + * @param type The {@link Type} of this track selection. * @param random A source of random numbers. */ - public RandomTrackSelection(TrackGroup group, int[] tracks, int type, Random random) { + public RandomTrackSelection(TrackGroup group, int[] tracks, @Type int type, Random random) { super(group, tracks, type); this.random = random; selectedIndex = random.nextInt(length); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java index 87ef28706d7..0bb622f47de 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java @@ -648,6 +648,7 @@ protected final void setOutput(@Nullable Object output) { * *

The default implementation does not allow decoder reuse. * + * @param decoderName The name of the decoder. * @param oldFormat The previous format. * @param newFormat The new format. * @return The result of the evaluation. diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashChunkSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashChunkSource.java index 98975750811..aa58bc760b9 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashChunkSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashChunkSource.java @@ -48,6 +48,8 @@ interface Factory { * if unknown. * @param enableEventMessageTrack Whether to output an event message track. * @param closedCaptionFormats The {@link Format Formats} of closed caption tracks to be output. + * @param playerEmsgHandler The track output to write emsg messages to, or null if emsgs + * shouldn't be written. * @param transferListener The transfer listener which should be informed of any data transfers. * May be null if no listener is available. * @param playerId The {@link PlayerId} of the player using this chunk source. @@ -73,8 +75,9 @@ DashChunkSource createDashChunkSource( * Updates the manifest. * * @param newManifest The new manifest. + * @param newPeriodIndex The index of the period covered by {@code newManifest}. */ - void updateManifest(DashManifest newManifest, int periodIndex); + void updateManifest(DashManifest newManifest, int newPeriodIndex); /** * Updates the track selection. diff --git a/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSourceUtil.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSourceUtil.java index b0a31d9b7b5..b9ccd6e4f69 100644 --- a/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSourceUtil.java +++ b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSourceUtil.java @@ -54,6 +54,7 @@ public static byte[] readToEnd(DataSource dataSource) throws IOException { * array containing the read data. * * @param dataSource The source from which to read. + * @param length The number of bytes to read. * @return The read data. * @throws IOException If an error occurs reading from the source. * @throws IllegalStateException If the end of the source was reached before {@code length} bytes diff --git a/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java index 5720ef7ac13..0cf4f6968b5 100644 --- a/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java +++ b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java @@ -145,6 +145,7 @@ public DefaultDataSource createDataSource() { * Constructs a new instance, optionally configured to follow cross-protocol redirects. * * @param context A context. + * @param allowCrossProtocolRedirects Whether to allow cross-protocol redirects. */ public DefaultDataSource(Context context, boolean allowCrossProtocolRedirects) { this( diff --git a/library/effect/src/androidTest/java/com/google/android/exoplayer2/effect/BitmapTestUtil.java b/library/effect/src/androidTest/java/com/google/android/exoplayer2/effect/BitmapTestUtil.java index d8fed8623e1..e87414ec63a 100644 --- a/library/effect/src/androidTest/java/com/google/android/exoplayer2/effect/BitmapTestUtil.java +++ b/library/effect/src/androidTest/java/com/google/android/exoplayer2/effect/BitmapTestUtil.java @@ -106,6 +106,8 @@ public static Bitmap createArgb8888BitmapFromRgba8888Image(Image image) { /** * Returns a solid {@link Bitmap} with every pixel having the same color. * + * @param width The width of image to create, in pixels. + * @param height The height of image to create, in pixels. * @param color An RGBA color created by {@link Color}. */ public static Bitmap createArgb8888BitmapWithSolidColor(int width, int height, int color) { diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/FlacFrameReader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/FlacFrameReader.java index aefc69c0d5c..137583e2a95 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/FlacFrameReader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/FlacFrameReader.java @@ -130,6 +130,7 @@ public static boolean checkFrameHeaderFromPeek( * there is no guarantee on the peek position. * * @param input Input stream to get the sample number from (starting from the read position). + * @param flacStreamMetadata The FLAC metadata of the stream. * @return The frame first sample number. * @throws ParserException If an error occurs parsing the sample number. * @throws IOException If peeking from the input fails. diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.java index 2f4300acacc..fc56535cda6 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.java @@ -150,12 +150,13 @@ public void setTargetVoice(String targetVoice) { *

  • Universal selector matching scores 1. * * + *

    See also CSS Cascading. + * * @param id The id of the cue if present, {@code null} otherwise. * @param tag Name of the tag, {@code null} if it refers to the entire cue. * @param classes An array containing the classes the tag belongs to. Must not be null. * @param voice Annotated voice if present, {@code null} otherwise. * @return The score of the match, zero if there is no match. - * @see CSS Cascading */ public int getSpecificityScore( @Nullable String id, @Nullable String tag, Set classes, @Nullable String voice) { diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java index e215192ca38..7f71a95b27f 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java @@ -102,13 +102,17 @@ public final class HlsMediaPeriod implements MediaPeriod, HlsPlaylistTracker.Pla * be null if no listener is available. * @param drmSessionManager The {@link DrmSessionManager} to acquire {@link DrmSession * DrmSessions} with. + * @param drmEventDispatcher A {@link DrmSessionEventListener.EventDispatcher} used to distribute + * DRM-related events. * @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}. * @param eventDispatcher A dispatcher to notify of events. * @param allocator An {@link Allocator} from which to obtain media buffer allocations. * @param compositeSequenceableLoaderFactory A factory to create composite {@link * SequenceableLoader}s for when this media source loads data from multiple streams. * @param allowChunklessPreparation Whether chunkless preparation is allowed. + * @param metadataType The type of metadata to extract from the period. * @param useSessionKeys Whether to use #EXT-X-SESSION-KEY tags. + * @param playerId The ID of the current player. */ public HlsMediaPeriod( HlsExtractorFactory extractorFactory, diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java index 9a77f444eaa..e557c7d62a1 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java @@ -460,16 +460,20 @@ public RenditionReport(Uri playlistUri, long lastMediaSequence, int lastPartInde public final ServerControl serverControl; /** + * Constructs an instance. + * * @param playlistType See {@link #playlistType}. * @param baseUri See {@link #baseUri}. * @param tags See {@link #tags}. * @param startOffsetUs See {@link #startOffsetUs}. + * @param preciseStart See {@link #preciseStart}. * @param startTimeUs See {@link #startTimeUs}. * @param hasDiscontinuitySequence See {@link #hasDiscontinuitySequence}. * @param discontinuitySequence See {@link #discontinuitySequence}. * @param mediaSequence See {@link #mediaSequence}. * @param version See {@link #version}. * @param targetDurationUs See {@link #targetDurationUs}. + * @param partTargetDurationUs See {@link #partTargetDurationUs}. * @param hasIndependentSegments See {@link #hasIndependentSegments}. * @param hasEndTag See {@link #hasEndTag}. * @param hasProgramDateTime See {@link #hasProgramDateTime}. diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java index e7cf180dde1..ee51719c650 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java @@ -1096,7 +1096,10 @@ public static final class ExecuteRunnable extends Action { private final Runnable runnable; /** + * Constructs an instance. + * * @param tag A tag to use for logging. + * @param runnable The runnable to run. */ public ExecuteRunnable(@Size(max = 23) String tag, Runnable runnable) { super(tag, "ExecuteRunnable"); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ActionSchedule.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ActionSchedule.java index 22422a0c91c..f006ac991ec 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ActionSchedule.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ActionSchedule.java @@ -347,7 +347,7 @@ public Builder setAudioAttributes(AudioAttributes audioAttributes, boolean handl } /** - * Schedules a set media items action to be executed. + * Schedules a set media source actions to be executed. * * @param mediaItemIndex The media item index to start playback from or {@link C#INDEX_UNSET} if * the playback position should not be reset. @@ -355,6 +355,7 @@ public Builder setAudioAttributes(AudioAttributes audioAttributes, boolean handl * C#TIME_UNSET} is passed the default position is used. In any case, if {@code * mediaItemIndex} is set to {@link C#INDEX_UNSET} the position is not reset at all and this * parameter is ignored. + * @param sources The media sources to be set on the player. * @return The builder, for convenience. */ @CanIgnoreReturnValue @@ -363,9 +364,10 @@ public Builder setMediaSources(int mediaItemIndex, long positionMs, MediaSource. } /** - * Schedules a set media items action to be executed. + * Schedules a set media sources action to be executed. * * @param resetPosition Whether the playback position should be reset. + * @param sources The media sources to be set on the player. * @return The builder, for convenience. */ @CanIgnoreReturnValue @@ -488,6 +490,7 @@ public Builder setShuffleModeEnabled(boolean shuffleModeEnabled) { /** * Schedules sending a {@link PlayerMessage}. * + * @param target A message target. * @param positionMs The position in the current media item at which the message should be sent, * in milliseconds. * @return The builder, for convenience. diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExtractorAsserts.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExtractorAsserts.java index 633914bfed1..050990f9efe 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExtractorAsserts.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExtractorAsserts.java @@ -358,6 +358,9 @@ public static void assertBehavior( * *

    The output of the extractor is compared against prerecorded dump files. * + * @param factory An {@link ExtractorFactory} which creates instances of the {@link Extractor} + * class which is to be tested. + * @param file The input file to pass to the extractor. * @param assertionConfig Details of how to read and process the source and dump files. * @param simulationConfig Details on the environment to simulate and behaviours to assert. * @throws IOException If reading from the input fails. diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaPeriod.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaPeriod.java index 1792ecbcdea..d78a6c35ae9 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaPeriod.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaPeriod.java @@ -373,6 +373,7 @@ public boolean isLoading() { /** * Creates a new {@link FakeSampleStream}. * + * @param allocator An {@link Allocator} from which to obtain media buffer allocations. * @param mediaSourceEventDispatcher A {@link MediaSourceEventListener.EventDispatcher} to notify * of media events. * @param drmSessionManager A {@link DrmSessionManager} for DRM interactions. diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSource.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSource.java index 715b02c24fe..639996057e5 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSource.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSource.java @@ -337,6 +337,7 @@ public List getCreatedMediaPeriods() { * @param allocator An {@link Allocator} from which to obtain media buffer allocations. * @param mediaSourceEventDispatcher An {@link MediaSourceEventListener.EventDispatcher} to * dispatch media source events. + * @param drmSessionManager A {@link DrmSessionManager} to allow DRM interactions. * @param drmEventDispatcher An {@link MediaSourceEventListener.EventDispatcher} to dispatch DRM * events. * @param transferListener The transfer listener which should be informed of any data transfers. diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTimeline.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTimeline.java index 20d9e213437..398024dde9c 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTimeline.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTimeline.java @@ -391,6 +391,7 @@ public FakeTimeline(TimelineWindowDefinition... windowDefinitions) { /** * Creates a fake timeline with the given window definitions. * + * @param manifests The manifests of the windows. * @param windowDefinitions A list of {@link TimelineWindowDefinition}s. */ public FakeTimeline(Object[] manifests, TimelineWindowDefinition... windowDefinitions) { @@ -401,6 +402,8 @@ public FakeTimeline(Object[] manifests, TimelineWindowDefinition... windowDefini * Creates a fake timeline with the given window definitions and {@link * com.google.android.exoplayer2.source.ShuffleOrder}. * + * @param manifests The manifests of the windows. + * @param shuffleOrder A shuffle ordering for the windows. * @param windowDefinitions A list of {@link TimelineWindowDefinition}s. */ public FakeTimeline( diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/MediaSourceTestRunner.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/MediaSourceTestRunner.java index 747957feb1d..302c69cee6b 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/MediaSourceTestRunner.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/MediaSourceTestRunner.java @@ -150,6 +150,7 @@ public MediaPeriod createPeriod(final MediaPeriodId periodId) { * playback thread, asserting that a non-null {@link MediaPeriod} is returned. * * @param periodId The id of the period to create. + * @param startPositionUs The expected start position, in microseconds. * @return The created {@link MediaPeriod}. */ public MediaPeriod createPeriod(final MediaPeriodId periodId, long startPositionUs) { diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TimelineAsserts.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TimelineAsserts.java index 1627f3a6cfa..fa8ee85a032 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TimelineAsserts.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TimelineAsserts.java @@ -48,6 +48,7 @@ public static void assertEmpty(Timeline timeline) { /** * Asserts that window tags are set correctly. * + * @param timeline The timeline to read actual window tags from. * @param expectedWindowTags A list of expected window tags. If a tag is unknown or not important * {@code null} can be passed to skip this window. */ From 27fbf0ab44383a4585fda752b953b7cc2da0027a Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 6 Mar 2023 12:17:13 +0000 Subject: [PATCH 4/8] Update templates to more clearly signpost between exoplayer2 and media3 Issue: google/ExoPlayer#11031 #minor-release PiperOrigin-RevId: 514366016 (cherry picked from commit 06741778e470d33c9d8bb6f994d578ee832dab28) --- .github/ISSUE_TEMPLATE/bug.yml | 12 ++++++++++-- .github/ISSUE_TEMPLATE/feature_request.md | 20 +++++++++++++++----- .github/ISSUE_TEMPLATE/question.md | 18 +++++++++++++----- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 9c539aaea5f..ae75cecd01d 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -5,12 +5,20 @@ body: - type: markdown attributes: value: | - We can only process bug reports that are actionable. Unclear bug reports or reports with insufficient information may not get attention. + We can only process bug reports that are actionable. Unclear bug reports or reports with + insufficient information may not get attention. + + Please only file a bug here if you're using classes in the `com.google.android.exoplayer2` + package. If you're using classes in the `androidx.media3` package (including + `com.google.android.exoplayer2`), please file a bug on the AndroidX Media GitHub issue tracker + instead: https://github.com/androidx/media/issues/new/choose Before filing a bug: ------------------------- - - Search existing issues, including issues that are closed: https://github.com/google/ExoPlayer/issues?q=is%3Aissue + - Search existing issues, including issues that are closed + - On this tracker: https://github.com/google/ExoPlayer/issues?q=is%3Aissue + - On the AndroidX Media tracker: https://github.com/androidx/media/issues?q=is%3Aissue - Consult our developer website: https://exoplayer.dev/ - Check the supported formats: https://exoplayer.dev/supported-formats.html - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 0019736e88d..129b79c06b0 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -6,11 +6,21 @@ labels: enhancement, needs triage assignees: '' --- -Before filing a feature request: ------------------------ -- Search existing open issues, specifically with the label ‘enhancement’: - https://github.com/google/ExoPlayer/labels/enhancement -- Search existing pull requests: https://github.com/google/ExoPlayer/pulls +Please only file a feature request here if you're using classes in the +`com.google.android.exoplayer2` package. If you're using classes in the +`androidx.media3` package (including `com.google.android.exoplayer2`), please file a +feature request on the AndroidX Media tracker instead: +https://github.com/androidx/media/issues/new/choose + +## Before filing a feature request: + +- Search existing open issues, specifically with the label ‘enhancement’ + - On this tracker: https://github.com/google/ExoPlayer/labels/enhancement + - On the AndroidX Media tracker: + https://github.com/androidx/media/labels/enhancement +- Search existing pull requests + - On this tracker: https://github.com/google/ExoPlayer/pulls + - On the AndroidX Media tracker: https://github.com/androidx/media/pulls When filing a feature request: ----------------------- diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md index 129d3d99746..d5c4869aa1a 100644 --- a/.github/ISSUE_TEMPLATE/question.md +++ b/.github/ISSUE_TEMPLATE/question.md @@ -9,14 +9,22 @@ assignees: '' Unfortunately we can't answer all questions. Unclear questions or questions with insufficient information may not get attention. +Please only file a question here if you're using classes in the +`com.google.android.exoplayer2` package. If you're using classes in the +`androidx.media3` package (including `com.google.android.exoplayer2`), please file a +question on the AndroidX Media tracker instead: +https://github.com/androidx/media/issues/new/choose + Before filing a question: ------------------------- -- Ask general Android development questions on Stack Overflow -- Search existing issues, including issues that are closed - https://github.com/google/ExoPlayer/issues?q=is%3Aissue -- Consult our developer website (https://exoplayer.dev/) and Javadoc - (https://exoplayer.dev/doc/reference/) +- Ask general Android development questions on Stack Overflow +- Search existing issues, including issues that are closed + - On this tracker: https://github.com/google/ExoPlayer/issues?q=is%3Aissue + - On the AndroidX Media tracker: + https://github.com/androidx/media/issues?q=is%3Aissue +- Consult our developer website (https://exoplayer.dev/) and Javadoc + (https://exoplayer.dev/doc/reference/) When filing a question: ------------------------- From 98685c9041a1d06eeb5f226276cad6bcd4d43c89 Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 13 Mar 2023 16:34:00 +0000 Subject: [PATCH 5/8] Update docs and READMEs for media3 stable release - The ExoPlayer docs will link to the media3 ones (for now, we can permanently redirect once no further stand-alone ExoPlayer release is published). - Contibuting issues and PRs should only happen on the media3 repo. - The media3 README is updated to remove any pre-release status information. PiperOrigin-RevId: 516234594 (cherry picked from commit 8a9c51a8a25fb05a6a40b6c142ef182978ef755d) --- .github/ISSUE_TEMPLATE/bug.yml | 128 +++------------------- .github/ISSUE_TEMPLATE/feature_request.md | 33 +----- .github/ISSUE_TEMPLATE/question.md | 46 +------- CONTRIBUTING.md | 41 +------ README.md | 47 ++++---- docs/ad-insertion.md | 5 + docs/analytics.md | 5 + docs/battery-consumption.md | 5 + docs/customization.md | 5 + docs/dash.md | 5 + docs/debug-logging.md | 5 + docs/demo-application.md | 5 + docs/downloading-media.md | 5 + docs/drm.md | 5 + docs/glossary.md | 6 + docs/hello-world.md | 5 + docs/hls.md | 5 + docs/index.md | 7 +- docs/listening-to-player-events.md | 5 + docs/live-streaming.md | 5 + docs/media-items.md | 5 + docs/media-sources.md | 5 + docs/network-stacks.md | 6 + docs/oems.md | 5 + docs/playlists.md | 6 + docs/progressive.md | 5 + docs/pros-and-cons.md | 5 + docs/retrieving-metadata.md | 5 + docs/rtsp.md | 5 + docs/shrinking.md | 5 + docs/smoothstreaming.md | 5 + docs/supported-devices.md | 6 + docs/supported-formats.md | 6 + docs/track-selection.md | 5 + docs/transforming-media.md | 5 + docs/troubleshooting.md | 5 + docs/ui-components.md | 5 + 37 files changed, 214 insertions(+), 248 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index ae75cecd01d..5219fda6e05 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -2,120 +2,18 @@ name: Bug Report description: Report a bug in the ExoPlayer library labels: ["bug", "needs triage"] body: - - type: markdown - attributes: - value: | - We can only process bug reports that are actionable. Unclear bug reports or reports with - insufficient information may not get attention. +- type: markdown + attributes: + value: | + **Please do not file new issues in this repository.** - Please only file a bug here if you're using classes in the `com.google.android.exoplayer2` - package. If you're using classes in the `androidx.media3` package (including - `com.google.android.exoplayer2`), please file a bug on the AndroidX Media GitHub issue tracker - instead: https://github.com/androidx/media/issues/new/choose + All new bugs should be filed in the + [Media3 issue tracker](https://github.com/androidx/media/issues/new?template=bug.yml). - Before filing a bug: - ------------------------- - - - Search existing issues, including issues that are closed - - On this tracker: https://github.com/google/ExoPlayer/issues?q=is%3Aissue - - On the AndroidX Media tracker: https://github.com/androidx/media/issues?q=is%3Aissue - - Consult our developer website: https://exoplayer.dev/ - - Check the supported formats: https://exoplayer.dev/supported-formats.html - - type: dropdown - attributes: - label: ExoPlayer Version - description: What version of ExoPlayer are you using? - options: - - 2.18.4 - - 2.18.3 - - 2.18.2 - - 2.18.1 - - 2.18.0 - - 2.17.1 - - 2.17.0 - - 2.16.1 - - 2.16.0 - - 2.15.1 - - 2.15.0 - - 2.14.2 - - 2.14.1 - - 2.14.0 - - 2.13.3 - - Older (unsupported) - validations: - required: true - - type: textarea - attributes: - label: Devices that reproduce the issue - placeholder: | - Example: - * Pixel 4 running Android 12 - * Samsung S21 running Android 11 - validations: - required: true - - type: textarea - attributes: - label: Devices that do not reproduce the issue - placeholder: | - Example: - * Pixel 3 running Android Pie - - type: dropdown - attributes: - label: Reproducible in the demo app? - description: Please try and reproduce the issue in the [ExoPlayer demo app](https://exoplayer.dev/demo-application.html). - options: - - "Yes" - - "No" - - Not tested - validations: - required: true - - type: textarea - attributes: - label: Reproduction steps - description: Clear and complete steps we can use to reproduce the problem - placeholder: | - Example: - 1. Play the attached media in the demo app - 2. Seek forward 10s - validations: - required: true - - type: textarea - attributes: - label: Expected result - placeholder: | - Example: - The media plays successfully - validations: - required: true - - type: textarea - attributes: - label: Actual result - placeholder: | - Example: - Playback crashes with the following stack trace: - ... - validations: - required: true - - type: textarea - attributes: - label: Media - description: | - Media we can use to reproduce the problem. Either: - * Attach a file here - * Include a media URL - * Refer to a piece of media from the demo app (e.g. `Misc > Dizzy (MP4)`) - * If you don't want to post media publicly please email the info to dev.exoplayer@gmail.com with subject 'Issue #\' after filing this issue, and note that you will do this here. - * If you are certain the issue does not depend on the media being played, enter "Not applicable" here. - - For DRM-protected media please also include the scheme and license server URL. - validations: - required: true - - type: checkboxes - attributes: - label: Bug Report - description: | - After filing this issue please run `adb bugreport` shortly after reproducing the problem (ideally in the [demo app](https://exoplayer.dev/demo-application.html)) to capture a zip file, and email this to dev.exoplayer@gmail.com with subject 'Issue #\'. - - **Note:** Logcat output is **not** the same as a full bug report, and is often missing information that's useful for diagnosing issues. Please ensure you're sending a full bug report zip file. - options: - - label: You will email the zip file produced by `adb bugreport` to dev.exoplayer@gmail.com after filing this issue. + We will continue to update and reply to existing issues in this repository + and will keep existing feature requests active. +- type: textarea + attributes: + label: Bug + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 129b79c06b0..e5335b09bc5 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -6,33 +6,10 @@ labels: enhancement, needs triage assignees: '' --- -Please only file a feature request here if you're using classes in the -`com.google.android.exoplayer2` package. If you're using classes in the -`androidx.media3` package (including `com.google.android.exoplayer2`), please file a -feature request on the AndroidX Media tracker instead: -https://github.com/androidx/media/issues/new/choose +**Please do not file new issues in this repository.** -## Before filing a feature request: +All new feature requests should be filed in the +[Media3 issue tracker](https://github.com/androidx/media/issues/new?template=feature_request.md). -- Search existing open issues, specifically with the label ‘enhancement’ - - On this tracker: https://github.com/google/ExoPlayer/labels/enhancement - - On the AndroidX Media tracker: - https://github.com/androidx/media/labels/enhancement -- Search existing pull requests - - On this tracker: https://github.com/google/ExoPlayer/pulls - - On the AndroidX Media tracker: https://github.com/androidx/media/pulls - -When filing a feature request: ------------------------ -Replace the content in the sections below. - -### [REQUIRED] Use case description -Describe the use case or problem you are trying to solve in detail. If there are -any standards or specifications involved, please provide the relevant details. - -### Proposed solution -A clear and concise description of your proposed solution, if you have one. - -### Alternatives considered -A clear and concise description of any alternative solutions you considered, -if applicable. +We will continue to update and reply to existing issues in this repository and +will keep existing feature requests active. diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md index d5c4869aa1a..3f31584a89d 100644 --- a/.github/ISSUE_TEMPLATE/question.md +++ b/.github/ISSUE_TEMPLATE/question.md @@ -6,46 +6,10 @@ labels: question, needs triage assignees: '' --- -Unfortunately we can't answer all questions. Unclear questions or questions with -insufficient information may not get attention. +**Please do not file new issues in this repository.** -Please only file a question here if you're using classes in the -`com.google.android.exoplayer2` package. If you're using classes in the -`androidx.media3` package (including `com.google.android.exoplayer2`), please file a -question on the AndroidX Media tracker instead: -https://github.com/androidx/media/issues/new/choose +All new questions should be filed in the +[Media3 issue tracker](https://github.com/androidx/media/issues/new?template=question.md). -Before filing a question: -------------------------- - -- Ask general Android development questions on Stack Overflow -- Search existing issues, including issues that are closed - - On this tracker: https://github.com/google/ExoPlayer/issues?q=is%3Aissue - - On the AndroidX Media tracker: - https://github.com/androidx/media/issues?q=is%3Aissue -- Consult our developer website (https://exoplayer.dev/) and Javadoc - (https://exoplayer.dev/doc/reference/) - -When filing a question: -------------------------- - -Describe your question in detail. - -In case your question refers to a problem you are seeing in your app: - -- Output of running `$ adb bugreport` in the console - -In case your question is related to a piece of media: - -- URI to test content -- For protected content: - - DRM scheme and license server URL - - Authentication HTTP headers - -Don't forget to check supported formats and devices -(https://exoplayer.dev/supported-formats.html). - -If there's something you don't want to post publicly, please submit the issue, -then email the link/bug report to dev.exoplayer@gmail.com using a subject in the -format "Issue #1234", where #1234 is your issue number (we don't reply to -emails). +We will continue to update and reply to existing issues in this repository and +will keep existing feature requests active. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b685679cef8..cca79e7295b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,40 +2,7 @@ ## Reporting issues ## -We use the [GitHub issue tracker](https://github.com/google/ExoPlayer/issues) -to track bugs, feature requests and questions. - -Before filing a new issue, please search the tracker to check if it's already -covered by an existing report. Avoiding duplicates helps us maximize the time we -can spend fixing bugs and adding new features. - -When filing an issue, be sure to provide enough information for us to -efficiently diagnose and reproduce the problem. In particular, please include -all of the information requested in the issue template. - -## Pull requests ## - -We will also consider high quality pull requests. These should merge -into the `dev-v2` branch. Before a pull request can be accepted you must submit -a Contributor License Agreement, as described below. - -## Contributor license agreement ## - -Contributions to any Google project must be accompanied by a Contributor -License Agreement. This is not a copyright **assignment**, it simply gives -Google permission to use and redistribute your contributions as part of the -project. - - * If you are an individual writing original source code and you're sure you - own the intellectual property, then you'll need to sign an [individual - CLA][]. - - * If you work for a company that wants to allow you to contribute your work, - then you'll need to sign a [corporate CLA][]. - -You generally only need to submit a CLA once, so if you've already submitted -one (even if it was for a different project), you probably don't need to do it -again. - -[individual CLA]: https://developers.google.com/open-source/cla/individual -[corporate CLA]: https://developers.google.com/open-source/cla/corporate +The ExoPlayer project is now developed as part of the +[AndroidX Media](https://github.com/androidx/media/blob/release/CONTRIBUTING.md) +project. Please use that project to file bugs, feature requests, questions and +pull requests. diff --git a/README.md b/README.md index e96ddf9db16..93691921222 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,35 @@ # ExoPlayer -ExoPlayer is an application level media player for Android. It provides an -alternative to Android’s MediaPlayer API for playing audio and video both -locally and over the Internet. ExoPlayer supports features not currently -supported by Android’s MediaPlayer API, including DASH and SmoothStreaming -adaptive playbacks. Unlike the MediaPlayer API, ExoPlayer is easy to customize -and extend, and can be updated through Play Store application updates. +ExoPlayer is an application level media player for Android. The latest version +is published as part of [AndroidX Media][] under a new package name and all +future development will be in that project. + +Please refer to our [migration guide and script][] to move your codebase to the +Media3 package names. + +[AndroidX Media]: https://github.com/androidx/media +[migration guide and script]: https://developer.android.com/guide/topics/media/media3/getting-started/migration-guide ## Documentation -* The [developer guide][] provides a wealth of information. -* The [class reference][] documents ExoPlayer classes. -* The [release notes][] document the major changes in each release. -* Follow our [developer blog][] to keep up to date with the latest ExoPlayer - developments! +* The [developer guide][] provides a wealth of information. +* The [class reference][] documents ExoPlayer classes. Note that the classes + are documented with their Media3 package names. +* The [release notes][] document the major changes in each release. +* Follow our [developer blog][] to keep up to date with the latest ExoPlayer + developments! -[developer guide]: https://exoplayer.dev/guide.html -[class reference]: https://exoplayer.dev/doc/reference +[developer guide]: https://developer.android.com/guide/topics/media/exoplayer +[class reference]: https://developer.android.com/reference/androidx/media3/common/package-summary [release notes]: https://github.com/google/ExoPlayer/blob/release-v2/RELEASENOTES.md [developer blog]: https://medium.com/google-exoplayer ## Using ExoPlayer +Please refer to +[AndroidX Media](https://github.com/androidx/media/blob/release/README.md) for +the usage instructions of the latest release. + ExoPlayer modules can be obtained from [the Google Maven repository][]. It's also possible to clone the repository and depend on the modules locally. @@ -125,16 +133,3 @@ implementation project(':exoplayer-library-core') implementation project(':exoplayer-library-dash') implementation project(':exoplayer-library-ui') ``` - -## Developing ExoPlayer - -#### Project branches - -* Development work happens on the `dev-v2` branch. Pull requests should - normally be made to this branch. -* The `release-v2` branch holds the most recent release. - -#### Using Android Studio - -To develop ExoPlayer using Android Studio, simply open the ExoPlayer project in -the root directory of the repository. diff --git a/docs/ad-insertion.md b/docs/ad-insertion.md index 649ee36ddbe..9ccdba968d2 100644 --- a/docs/ad-insertion.md +++ b/docs/ad-insertion.md @@ -2,6 +2,10 @@ title: Ad insertion --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + ExoPlayer can be used for both client-side and server-side ad insertion. ## Client-side ad insertion ## @@ -314,6 +318,7 @@ timed metadata formats are supported by ExoPlayer. Custom ads SDK `MediaSource` implementations can listen for timed metadata events from the player via `Player.Listener.onMetadata`. +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/ad-insertion [VAST]: https://www.iab.com/wp-content/uploads/2015/06/VASTv3_0.pdf [VMAP]: https://www.iab.com/guidelines/digital-video-multiple-ad-playlist-vmap-1-0-1/ [ExoPlayer UI components]: {{ site.baseurl }}/ui-components.html diff --git a/docs/analytics.md b/docs/analytics.md index f2bf7a9a8fb..9622aee23be 100644 --- a/docs/analytics.md +++ b/docs/analytics.md @@ -2,6 +2,10 @@ title: Analytics --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + ExoPlayer supports a wide range of playback analytics needs. Ultimately, analytics is about collecting, interpreting, aggregating and summarizing data from playbacks. This data can be used either on the device, for example for @@ -260,5 +264,6 @@ player.addAnalyticsListener(new ExtendedListener() { ~~~ {: .language-java} +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/analytics [`PlaybackStats` Javadoc]: {{ site.exo_sdk }}/analytics/PlaybackStats.html [aggregate the analytics data]: {{ site.baseurl }}/analytics.html#aggregate-analytics-data-of-multiple-playbacks diff --git a/docs/battery-consumption.md b/docs/battery-consumption.md index c7879e57246..5295040d5a1 100644 --- a/docs/battery-consumption.md +++ b/docs/battery-consumption.md @@ -2,6 +2,10 @@ title: Battery consumption --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + ## How important is battery consumption due to media playback? ## Avoiding unnecessary battery consumption is an important aspect of developing a @@ -73,4 +77,5 @@ the increased power consumption for audio only use cases on older devices is something an app developer must decide, taking their requirements and app usage patterns into account. +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/battery-consumption [Monsoon power monitor]: https://www.msoon.com/battery-configuration diff --git a/docs/customization.md b/docs/customization.md index 1c41162be3c..e28111e510c 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -2,6 +2,10 @@ title: Customization --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + At the core of the ExoPlayer library is the `Player` interface. A `Player` exposes traditional high-level media player functionality such as the ability to buffer media, play, pause and seek. The default implementation `ExoPlayer` is @@ -304,6 +308,7 @@ When building custom components, we recommend the following: ensures that they are executed in order with any other operations being performed on the player. +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/customization [customizing the network stack used by ExoPlayer]: {{ site.baseurl }}/network-stacks.html [LoadErrorHandlingPolicy]: {{ site.exo_sdk }}/upstream/LoadErrorHandlingPolicy.html [media source based playlist API]: {{ site.baseurl }}/media-sources.html#media-source-based-playlist-api diff --git a/docs/dash.md b/docs/dash.md index 88cc6679138..6f0e5a9d706 100644 --- a/docs/dash.md +++ b/docs/dash.md @@ -2,6 +2,10 @@ title: DASH --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + {% include_relative _page_fragments/supported-formats-dash.md %} ## Using MediaItem ## @@ -83,4 +87,5 @@ player.addListener( ExoPlayer provides multiple ways for you to tailor playback experience to your app's needs. See the [Customization page][] for examples. +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/dash [Customization page]: {{ site.baseurl }}/customization.html diff --git a/docs/debug-logging.md b/docs/debug-logging.md index b93f03b9fff..4154920d636 100644 --- a/docs/debug-logging.md +++ b/docs/debug-logging.md @@ -2,6 +2,10 @@ title: Debug logging --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + By default ExoPlayer only logs errors. To log player events, the `EventLogger` class can be used. The additional logging it provides can be helpful for understanding what the player is doing, as well as for debugging playback @@ -116,4 +120,5 @@ EventLogger: videoDecoderInitialized [0.77, 0.00, window=0, period=0, video, OMX EventLogger: audioDecoderInitialized [0.79, 0.00, window=0, period=0, audio, OMX.google.aac.decoder] ``` +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/debug-logging [logcat tab]: https://developer.android.com/studio/debug/am-logcat diff --git a/docs/demo-application.md b/docs/demo-application.md index e9a50c34d4e..1a4a5ca8b7a 100644 --- a/docs/demo-application.md +++ b/docs/demo-application.md @@ -2,6 +2,10 @@ title: Demo application --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + ExoPlayer's main demo app serves two primary purposes: 1. To provide a relatively simple yet fully featured example of ExoPlayer usage. @@ -254,6 +258,7 @@ adb shell am start -a com.google.android.exoplayer.demo.action.VIEW_LIST \ ~~~ {: .language-shell} +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/demo-application [IMA extension]: {{ site.release_v2 }}/extensions/ima [GitHub project]: https://github.com/google/ExoPlayer [Supported devices]: {{ site.baseurl }}/supported-devices.html diff --git a/docs/downloading-media.md b/docs/downloading-media.md index 70c3e3d308d..84501442c9b 100644 --- a/docs/downloading-media.md +++ b/docs/downloading-media.md @@ -2,6 +2,10 @@ title: Downloading media --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + ExoPlayer provides functionality to download media for offline playback. In most use cases it's desirable for downloads to continue even when your app is in the background. For these use cases your app should subclass `DownloadService`, and @@ -397,6 +401,7 @@ adaptive content, the most likely cause is that the player is trying to adapt to a track that was not downloaded. Ensure you've set the stream keys correctly. {:.info} +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/downloading-media [JobScheduler]: {{ site.android_sdk }}/android/app/job/JobScheduler [PlatformScheduler]: {{ site.exo_sdk }}/scheduler/PlatformScheduler.html [WorkManager]: https://developer.android.com/topic/libraries/architecture/workmanager/ diff --git a/docs/drm.md b/docs/drm.md index 4a5bf7e5afe..f60f3299dcc 100644 --- a/docs/drm.md +++ b/docs/drm.md @@ -2,6 +2,10 @@ title: Digital rights management --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + ExoPlayer uses Android's [`MediaDrm`][] API to support DRM protected playbacks. The minimum Android versions required for different supported DRM schemes, along with the streaming formats for which they're supported, are: @@ -105,6 +109,7 @@ If you're experiencing video stuttering on a device running Android 6 to 11 when playing DRM protected content, you can try [enabling asynchronous buffer queueing]. +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/drm [main demo app]: {{ site.release_v2 }}/demos/main [`MediaDrm`]: {{ site.android_sdk }}/android/media/MediaDrm.html [used when building the player]: {{ site.baseurl }}/media-sources.html#customizing-media-source-creation diff --git a/docs/glossary.md b/docs/glossary.md index 1c7857a7644..52491483f36 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -2,6 +2,12 @@ title: Glossary --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/glossary + ## General - Media ## ###### ABR diff --git a/docs/hello-world.md b/docs/hello-world.md index 933df920cce..8a6bfed655d 100644 --- a/docs/hello-world.md +++ b/docs/hello-world.md @@ -6,6 +6,10 @@ redirect_from: - /getting-started.html --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + Another way to get started is to work through [the ExoPlayer codelab](https://codelabs.developers.google.com/codelabs/exoplayer-intro/). {:.info} @@ -209,6 +213,7 @@ It's important to release the player when it's no longer needed, so as to free up limited resources such as video decoders for use by other applications. This can be done by calling `ExoPlayer.release`. +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/hello-world [main demo app]: {{ site.release_v2 }}/demos/main/ [extensions directory]: {{ site.release_v2 }}/extensions/ [release notes]: {{ site.release_v2 }}/RELEASENOTES.md diff --git a/docs/hls.md b/docs/hls.md index 522c12170bc..be0c8d04ac7 100644 --- a/docs/hls.md +++ b/docs/hls.md @@ -2,6 +2,10 @@ title: HLS --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + {% include_relative _page_fragments/supported-formats-hls.md %} ## Using MediaItem ## @@ -128,6 +132,7 @@ The following guidelines apply specifically for live streams: * Use the `#EXT-X-DISCONTINUITY-SEQUENCE` tag. * Provide a long live window. One minute or more is great. +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/hls [HlsMediaSource]: {{ site.exo_sdk }}/source/hls/HlsMediaSource.html [HTTP Live Streaming]: https://tools.ietf.org/html/rfc8216 [Customization page]: {{ site.baseurl }}/customization.html diff --git a/docs/index.md b/docs/index.md index b28743192fb..ebdac8a04d6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,6 +2,10 @@ layout: article --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + ExoPlayer is an application level media player for Android. It provides an alternative to Android’s MediaPlayer API for playing audio and video both locally and over the Internet. ExoPlayer supports features not currently @@ -13,12 +17,13 @@ This website provides a wealth of information to help you get started. In addition, you can: * Learn how to add ExoPlayer to your app by [completing the codelab][] or -reading the [Hello world][] documentation. + reading the [Hello world][] documentation. * Read news, hints and tips on our [developer blog][]. * Read the latest [release notes][]. * Browse the library [Javadoc][]. * Browse the source code for the [latest release][] and current [tip of tree][]. +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer [completing the codelab]: https://codelabs.developers.google.com/codelabs/exoplayer-intro/ [Hello world]: {{ site.baseurl }}/hello-world.html [developer blog]: https://medium.com/google-exoplayer diff --git a/docs/listening-to-player-events.md b/docs/listening-to-player-events.md index 4b1215ba368..dc861f9fddc 100644 --- a/docs/listening-to-player-events.md +++ b/docs/listening-to-player-events.md @@ -2,6 +2,10 @@ title: Player events --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + ## Listening to playback events ## Events such as changes in state and playback errors are reported to registered @@ -224,6 +228,7 @@ player ~~~ {: .language-java } +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/listening-to-player-events [`Player.Listener`]: {{ site.exo_sdk }}/Player.Listener.html [Javadoc]: {{ site.exo_sdk }}/Player.Listener.html [`Individual callbacks vs onEvents`]: #individual-callbacks-vs-onevents diff --git a/docs/live-streaming.md b/docs/live-streaming.md index d0b2005ff87..4f62219d32c 100644 --- a/docs/live-streaming.md +++ b/docs/live-streaming.md @@ -2,6 +2,10 @@ title: Live streaming --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + ExoPlayer plays most adaptive live streams out-of-the-box without any special configuration. See the [Supported Formats page][] for more details. @@ -207,6 +211,7 @@ public void onPlayerError(PlaybackException error) { ~~~ {: .language-java} +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/live-streaming [Supported Formats page]: {{ site.baseurl }}/supported-formats.html [default UI components]: {{ site.baseurl }}/ui-components.html [pending feature request (#2213)]: https://github.com/google/ExoPlayer/issues/2213 diff --git a/docs/media-items.md b/docs/media-items.md index 2361f19a274..c4d701101e2 100644 --- a/docs/media-items.md +++ b/docs/media-items.md @@ -2,6 +2,10 @@ title: Media items --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + The [playlist API][] is based on `MediaItem`s, which can be conveniently built using `MediaItem.Builder`. Inside the player, media items are converted into playable `MediaSource`s by a `MediaSource.Factory`. Without @@ -155,5 +159,6 @@ the player also needs to have its `DefaultMediaSourceFactory` {% include media3-known-issue-box.html issue-id="185" description="Subtitles, clipping and ad insertion are only supported if you use `DefaultMediaSourceFactory`." %} +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/media-items [playlist API]: {{ site.baseurl }}/playlists.html [`MediaItem.Builder` Javadoc]: {{ site.exo_sdk }}/MediaItem.Builder.html diff --git a/docs/media-sources.md b/docs/media-sources.md index f7bf97b83a0..c8dabe7fd70 100644 --- a/docs/media-sources.md +++ b/docs/media-sources.md @@ -4,6 +4,10 @@ redirect_from: - /mediasource.html --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + In ExoPlayer every piece of media is represented by a `MediaItem`. However internally, the player needs `MediaSource` instances to play the content. The player creates these from media items using a `MediaSource.Factory`. @@ -75,6 +79,7 @@ exoPlayer.play(); ~~~ {: .language-java} +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/media-sources [DASH]: {{ site.baseurl }}/dash.html [SmoothStreaming]: {{ site.baseurl }}/smoothstreaming.html [HLS]: {{ site.baseurl }}/hls.html diff --git a/docs/network-stacks.md b/docs/network-stacks.md index 763c8797224..a3a7867cc21 100644 --- a/docs/network-stacks.md +++ b/docs/network-stacks.md @@ -2,6 +2,10 @@ title: Network stacks --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + ExoPlayer is commonly used for streaming media over the internet. It supports multiple network stacks for making its underlying network requests. Your choice of network stack can have a significant impact on streaming performance. @@ -176,3 +180,5 @@ to media playback, your choice of network stack should ultimately factor in our recommendations above for media streaming in isolation, the requirements of any other components that perform networking, and their relative importance to your application. + +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/network-stacks diff --git a/docs/oems.md b/docs/oems.md index 0e875f11ca1..ddc091b90be 100644 --- a/docs/oems.md +++ b/docs/oems.md @@ -2,6 +2,10 @@ title: OEM testing --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + ExoPlayer is used by a large number of Android applications. As an OEM, it's important to ensure that ExoPlayer works correctly both on new devices, and on new platform builds for existing devices. This page describes compatibility @@ -102,4 +106,5 @@ that the test is getting stuck calling into a platform component (e.g. `MediaCodec`, `MediaDrm`, `AudioTrack` etc). Inspect the call stacks of the threads in the test process to establish whether this is the case. +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/oems [GitHub]: https://github.com/google/ExoPlayer diff --git a/docs/playlists.md b/docs/playlists.md index d897e14e268..924110e6323 100644 --- a/docs/playlists.md +++ b/docs/playlists.md @@ -2,6 +2,10 @@ title: Playlists --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + The playlist API is defined by the `Player` interface, which is implemented by all `ExoPlayer` implementations. It enables sequential playback of multiple media items. The following example shows how to start playback of a playlist @@ -205,3 +209,5 @@ timeline update include: * A manifest becoming available after preparing an adaptive media item. * A manifest being updated periodically during playback of a live stream. + +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/playlists diff --git a/docs/progressive.md b/docs/progressive.md index 26a8002f39a..fa6f51e98b2 100644 --- a/docs/progressive.md +++ b/docs/progressive.md @@ -2,6 +2,10 @@ title: Progressive --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + {% include_relative _page_fragments/supported-formats-progressive.md %} ## Using MediaItem ## @@ -44,4 +48,5 @@ player.prepare(); ExoPlayer provides multiple ways for you to tailor playback experience to your app's needs. See the [Customization page][] for examples. +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/progressive [Customization page]: {{ site.baseurl }}/customization.html diff --git a/docs/pros-and-cons.md b/docs/pros-and-cons.md index 9e4f70525c3..4fd3467031d 100644 --- a/docs/pros-and-cons.md +++ b/docs/pros-and-cons.md @@ -2,6 +2,10 @@ title: Pros and cons --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + ExoPlayer has a number of advantages over Android's built in MediaPlayer: * Fewer device specific issues and less variation in behavior across different @@ -34,6 +38,7 @@ It's important to note that there are also some disadvantages: This is likely only a concern for extremely lightweight apps. Guidance for shrinking ExoPlayer can be found on the [APK shrinking page][]. +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/pros-and-cons [Supported formats page]: {{ site.baseurl }}/supported-formats.html [IMA extension]: {{ site.release_v2 }}/extensions/ima [Interactive Media Ads SDK]: https://developers.google.com/interactive-media-ads diff --git a/docs/retrieving-metadata.md b/docs/retrieving-metadata.md index 30d18f3fed2..1e222432948 100644 --- a/docs/retrieving-metadata.md +++ b/docs/retrieving-metadata.md @@ -2,6 +2,10 @@ title: Retrieving metadata --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + ## During playback ## The metadata of the media can be retrieved during playback in multiple ways. The @@ -84,6 +88,7 @@ for (int i = 0; i < trackGroups.length; i++) { ~~~ {: .language-java} +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/retrieving-metadata [`MediaMetadata`]: {{ site.exo_sdk }}/MediaMetadata.html [`Metadata.Entry`]: {{ site.exo_sdk }}/metadata/Metadata.Entry.html [`MetadataRetriever`]: {{ site.exo_sdk }}/MetadataRetriever.html diff --git a/docs/rtsp.md b/docs/rtsp.md index fea28f34a08..d6f510401ff 100644 --- a/docs/rtsp.md +++ b/docs/rtsp.md @@ -2,6 +2,10 @@ title: RTSP --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + {% include_relative _page_fragments/supported-formats-rtsp.md %} ## Using MediaItem ## @@ -96,3 +100,4 @@ MediaSource mediaSource = ~~~ {: .language-java} +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/rtsp diff --git a/docs/shrinking.md b/docs/shrinking.md index 655a4cdcd74..7855459a5f1 100644 --- a/docs/shrinking.md +++ b/docs/shrinking.md @@ -2,6 +2,10 @@ title: APK shrinking --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + Minimizing APK size is an important aspect of developing a good Android application. This is particularly true when targeting developing markets, and also when developing an Android Instant App. For such cases it may be desirable @@ -131,4 +135,5 @@ ProgressiveMediaSource mediaSource = ~~~ {: .language-java} +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/shrinking [Shrink, obfuscate, and optimize your app]: https://developer.android.com/studio/build/shrink-code diff --git a/docs/smoothstreaming.md b/docs/smoothstreaming.md index 94b3dce089e..84845aa7723 100644 --- a/docs/smoothstreaming.md +++ b/docs/smoothstreaming.md @@ -2,6 +2,10 @@ title: SmoothStreaming --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + {% include_relative _page_fragments/supported-formats-smoothstreaming.md %} ## Using MediaItem ## @@ -85,4 +89,5 @@ player.addListener( ExoPlayer provides multiple ways for you to tailor playback experience to your app's needs. See the [Customization page][] for examples. +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/smoothstreaming [Customization page]: {{ site.baseurl }}/customization.html diff --git a/docs/supported-devices.md b/docs/supported-devices.md index 43630efeab2..5248c0226e1 100644 --- a/docs/supported-devices.md +++ b/docs/supported-devices.md @@ -2,6 +2,10 @@ title: Supported devices --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + The minimum Android versions required for core ExoPlayer use cases are: | Use case | Android version number | Android API level | @@ -49,3 +53,5 @@ be found reported to the developer of the emulator rather than to the ExoPlayer team. Where possible, we recommend testing media applications on physical devices rather than emulators. + +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/supported-devices diff --git a/docs/supported-formats.md b/docs/supported-formats.md index 70b24416a8a..84f1de7fb2a 100644 --- a/docs/supported-formats.md +++ b/docs/supported-formats.md @@ -2,6 +2,10 @@ title: Supported formats --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + When defining the formats that ExoPlayer supports, it's important to note that "media formats" are defined at multiple levels. From the lowest level to the highest, these are: @@ -119,3 +123,5 @@ profile (if available), even if another decoder for the same MIME type that doesn't support that profile appears higher up the codec list. This can result in selecting a software decoder in cases where the stream exceeds the capabilities of a hardware decoder for the same MIME type. + +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/supported-formats diff --git a/docs/track-selection.md b/docs/track-selection.md index 6dd4d43f65b..3434a749e36 100644 --- a/docs/track-selection.md +++ b/docs/track-selection.md @@ -2,6 +2,10 @@ title: Track selection --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + When a media item contains multiple tracks, track selection is the process that determines which of them are chosen for playback. The track selection process is configured by [`TrackSelectionParameters`][], which allows many different @@ -211,4 +215,5 @@ Tunneled playback can be enabled in cases where the combination of renderers and selected tracks supports it. This can be done by using `DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)`. +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/track-selection [`TrackSelectionParameters`]: {{ site.exo_sdk }}/trackselection/TrackSelectionParameters.html diff --git a/docs/transforming-media.md b/docs/transforming-media.md index 3df1681c5e2..5c039ac2563 100644 --- a/docs/transforming-media.md +++ b/docs/transforming-media.md @@ -2,6 +2,10 @@ title: Transforming media --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + The [Transformer API][] can be used to convert media streams. It takes an input media stream, applies changes to it as configured by the app, and produces the corresponding output file. The available transformations are: @@ -133,6 +137,7 @@ flattened version of the video instead of the original one. Currently, Samsung's slow motion format is the only one supported. +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/transforming-media [Transformer API]: {{ site.exo_sdk }}/transformer/Transformer.html [Supported formats page]: {{ site.baseurl }}/supported-formats.html diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 5ced4e270df..15376049515 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -5,6 +5,10 @@ redirect_from: - /debugging-playback-issues.html --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + * [Fixing "Cleartext HTTP traffic not permitted" errors][] * [Fixing "SSLHandshakeException", "CertPathValidatorException" and "ERR_CERT_AUTHORITY_INVALID" errors][] * [Why are some media files not seekable?][] @@ -374,6 +378,7 @@ particularly when playing DRM protected or high frame rate content, you can try [Can I play YouTube videos directly with ExoPlayer?]: #can-i-play-youtube-videos-directly-with-exoplayer [Video playback is stuttering]: #video-playback-is-stuttering +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/troubleshooting [Supported formats]: {{ site.baseurl }}/supported-formats.html [set on a `DefaultExtractorsFactory`]: {{ site.base_url }}/customization.html#customizing-extractor-flags [`setMp3ExtractorFlags`]: {{ site.exo_sdk }}/extractor/DefaultExtractorsFactory#setMp3ExtractorFlags(@com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.Flagsint) diff --git a/docs/ui-components.md b/docs/ui-components.md index 4b934fcbcdc..92cb2367891 100644 --- a/docs/ui-components.md +++ b/docs/ui-components.md @@ -2,6 +2,10 @@ title: UI components --- +This documentation may be out-of-date. Please refer to the +[documentation for the latest ExoPlayer release][] on developer.android.com. +{:.info} + An app playing media requires user interface components for displaying media and controlling playback. The ExoPlayer library includes a UI module that contains a number of UI components. To depend on the UI module add a dependency as shown @@ -137,6 +141,7 @@ Where customization beyond that described above is required, we expect that app developers will implement their own UI components rather than use those provided by ExoPlayer's UI module. +[documentation for the latest ExoPlayer release]: https://developer.android.com/guide/topics/media/exoplayer/ui-components [`StyledPlayerView`]: {{ site.exo_sdk }}/ui/StyledPlayerView.html [`StyledPlayerControlView`]: {{ site.exo_sdk }}/ui/StyledPlayerControlView.html [resource IDs being marked 'private']: https://developer.android.com/studio/projects/android-library#PrivateResources From 496d02a417386ad0bc1d5c38e6549845734d05cc Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 14 Mar 2023 10:44:41 +0000 Subject: [PATCH 6/8] Update release notes for Media3 1.0.0 / ExoPlayer 2.18.5 PiperOrigin-RevId: 516478351 (cherry picked from commit 8389435af13c222e4b904651e9fa6e80c8b13b83) --- RELEASENOTES.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index a0b8ded4f31..0d4f4c531f9 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,5 +1,12 @@ # Release notes +### 2.18.5 (2023-03-22) + +This release corresponds to the +[AndroidX Media3 1.0.0 release](https://github.com/androidx/media/releases/tag/1.0.0). + +There are no changes since 2.18.4. + ### 2.18.4 (2023-03-02) This release corresponds to the From 63aa31001b4e93f3fecdc74232e5e5420b56cc34 Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 14 Mar 2023 14:05:26 +0000 Subject: [PATCH 7/8] Bump version numbers to Media3 1.0.0 and ExoPlayer 2.18.5 #minor-release PiperOrigin-RevId: 516514583 (cherry picked from commit 4fe8195c3c65d993be04884e2ff196eea4b8cf26) --- constants.gradle | 4 ++-- .../com/google/android/exoplayer2/ExoPlayerLibraryInfo.java | 6 +++--- media3-migration.sh | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/constants.gradle b/constants.gradle index fe6f6c299ce..3e799796b87 100644 --- a/constants.gradle +++ b/constants.gradle @@ -13,8 +13,8 @@ // limitations under the License. project.ext { // ExoPlayer version and version code. - releaseVersion = '2.18.4' - releaseVersionCode = 2_018_004 + releaseVersion = '2.18.5' + releaseVersionCode = 2_018_005 minSdkVersion = 16 appTargetSdkVersion = 33 // API version before restricting local file access. diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ExoPlayerLibraryInfo.java b/library/common/src/main/java/com/google/android/exoplayer2/ExoPlayerLibraryInfo.java index e02c09c8c5c..943a1a094c2 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/ExoPlayerLibraryInfo.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/ExoPlayerLibraryInfo.java @@ -27,11 +27,11 @@ public final class ExoPlayerLibraryInfo { /** The version of the library expressed as a string, for example "1.2.3". */ // Intentionally hardcoded. Do not derive from other constants (e.g. VERSION_INT) or vice versa. - public static final String VERSION = "2.18.4"; + public static final String VERSION = "2.18.5"; /** The version of the library expressed as {@code TAG + "/" + VERSION}. */ // Intentionally hardcoded. Do not derive from other constants (e.g. VERSION) or vice versa. - public static final String VERSION_SLASHY = "ExoPlayerLib/2.18.4"; + public static final String VERSION_SLASHY = "ExoPlayerLib/2.18.5"; /** * The version of the library expressed as an integer, for example 1002003. @@ -41,7 +41,7 @@ public final class ExoPlayerLibraryInfo { * integer version 123045006 (123-045-006). */ // Intentionally hardcoded. Do not derive from other constants (e.g. VERSION) or vice versa. - public static final int VERSION_INT = 2_018_004; + public static final int VERSION_INT = 2_018_005; /** Whether the library was compiled with {@link Assertions} checks enabled. */ public static final boolean ASSERTIONS_ENABLED = true; diff --git a/media3-migration.sh b/media3-migration.sh index 46d301735ac..69a9244ea66 100644 --- a/media3-migration.sh +++ b/media3-migration.sh @@ -128,8 +128,8 @@ extension-workmanager media3-exoplayer-workmanager' # Rewrites classes, packages and dependencies from the legacy ExoPlayer package structure # to androidx.media3 structure. -MEDIA3_VERSION="1.0.0-rc02" -LEGACY_PEER_VERSION="2.18.4" +MEDIA3_VERSION="1.0.0" +LEGACY_PEER_VERSION="2.18.5" function usage() { echo "usage: $0 [-p|-c|-d|-v]|[-m|-l [-x ] [-f] PROJECT_ROOT]" From 1bfde9818bc308393e89824956b79b92ccdf4b46 Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 14 Mar 2023 16:43:44 +0000 Subject: [PATCH 8/8] Update Javadoc for 2.18.5 #minor-release PiperOrigin-RevId: 516550914 (cherry picked from commit cebe01e87b68f3e4fbb988968fabf27935c266f3) --- .../exoplayer2/ExoPlaybackException.html | 2 ++ .../android/exoplayer2/Timeline.Period.html | 1 + .../com/google/android/exoplayer2/Tracks.html | 1 + .../exoplayer2/drm/OfflineLicenseHelper.html | 1 + .../ext/av1/Libgav1VideoRenderer.html | 2 ++ .../ext/vp9/LibvpxVideoRenderer.html | 2 ++ .../exoplayer2/extractor/FlacFrameReader.html | 1 + .../mediacodec/MediaCodecRenderer.html | 1 + .../exoplayer2/offline/SegmentDownloader.html | 1 + .../source/dash/DashChunkSource.Factory.html | 2 ++ .../source/dash/DashChunkSource.html | 5 +++-- .../dash/DefaultDashChunkSource.Factory.html | 2 ++ .../source/dash/DefaultDashChunkSource.html | 1 + .../exoplayer2/source/hls/HlsMediaPeriod.html | 4 ++++ .../source/hls/playlist/HlsMediaPlaylist.html | 7 ++++++- .../testutil/Action.ExecuteRunnable.html | 6 +++++- .../testutil/ActionSchedule.Builder.html | 11 +++++++---- .../exoplayer2/testutil/ExtractorAsserts.html | 3 +++ .../testutil/FakeAdaptiveMediaSource.html | 1 + .../exoplayer2/testutil/FakeMediaPeriod.html | 1 + .../exoplayer2/testutil/FakeMediaSource.html | 1 + .../exoplayer2/testutil/FakeTimeline.html | 3 +++ .../testutil/FakeTrackSelector.html | 1 + .../testutil/MediaSourceTestRunner.html | 1 + .../exoplayer2/testutil/TimelineAsserts.html | 1 + .../text/webvtt/WebvttCssStyle.html | 6 +++--- .../trackselection/DefaultTrackSelector.html | 1 + .../MappingTrackSelector.MappedTrackInfo.html | 1 + .../trackselection/RandomTrackSelection.html | 14 +++++++++----- .../exoplayer2/upstream/DataSourceUtil.html | 1 + .../upstream/DefaultDataSource.html | 1 + .../google/android/exoplayer2/util/Util.html | 1 + .../video/DecoderVideoRenderer.html | 1 + docs/doc/reference/constant-values.html | 6 +++--- docs/doc/reference/index-all.html | 18 ++++++++++++------ docs/doc/reference/member-search-index.js | 5 +++-- docs/doc/reference/member-search-index.zip | Bin 157719 -> 157734 bytes docs/doc/reference/package-search-index.zip | Bin 708 -> 708 bytes docs/doc/reference/type-search-index.zip | Bin 10990 -> 10990 bytes 39 files changed, 90 insertions(+), 27 deletions(-) diff --git a/docs/doc/reference/com/google/android/exoplayer2/ExoPlaybackException.html b/docs/doc/reference/com/google/android/exoplayer2/ExoPlaybackException.html index 6dae3b33f82..3c606af5476 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ExoPlaybackException.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ExoPlaybackException.html @@ -626,6 +626,8 @@

    createForRenderer

    Parameters:
    cause - The cause of the failure.
    +
    rendererName - The name of the renderer in which the + failure occurred.
    rendererIndex - The index of the renderer in which the failure occurred.
    rendererFormat - The Format the renderer was using at the time of the exception, or null if the renderer wasn't using a Format.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/Timeline.Period.html b/docs/doc/reference/com/google/android/exoplayer2/Timeline.Period.html index bd02191cd93..503dfda3232 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Timeline.Period.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Timeline.Period.html @@ -906,6 +906,7 @@

    getAdState

    Parameters:
    adGroupIndex - The ad group index.
    +
    adIndexInAdGroup - The index of the ad in the ad group.
    Returns:
    The state of the ad, or AdPlaybackState.AD_STATE_UNAVAILABLE if not yet known.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/Tracks.html b/docs/doc/reference/com/google/android/exoplayer2/Tracks.html index e65143a121e..2db48ceda14 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Tracks.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Tracks.html @@ -454,6 +454,7 @@

    isTypeSupported

    Returns true if at least one track of type trackType is supported.
    Parameters:
    +
    trackType - The track type to query support for.
    allowExceedsCapabilities - Whether to consider the track as supported if it has a supported MIME type, but otherwise exceeds the advertised capabilities of the device. For example, a video track for which there's a corresponding diff --git a/docs/doc/reference/com/google/android/exoplayer2/drm/OfflineLicenseHelper.html b/docs/doc/reference/com/google/android/exoplayer2/drm/OfflineLicenseHelper.html index e1dee9309f4..541d4dee42f 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/drm/OfflineLicenseHelper.html +++ b/docs/doc/reference/com/google/android/exoplayer2/drm/OfflineLicenseHelper.html @@ -394,6 +394,7 @@

    newWidevineInstance

    their own license URL.
    forceDefaultLicenseUrl - Whether to use defaultLicenseUrl for key requests that include their own license URL.
    +
    dataSourceFactory - A factory from which to obtain DataSource instances.
    optionalKeyRequestParameters - An optional map of parameters to pass as the last argument to MediaDrm.getKeyRequest(byte[], byte[], java.lang.String, int, java.util.HashMap<java.lang.String, java.lang.String>). May be null.
    eventDispatcher - A DrmSessionEventListener.EventDispatcher used to distribute diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.html b/docs/doc/reference/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.html index d9fa897bc38..aa1806f764d 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.html @@ -574,6 +574,8 @@

    canReuseDecoder

    Overrides:
    canReuseDecoder in class DecoderVideoRenderer
    +
    Parameters:
    +
    decoderName - The name of the decoder.
    oldFormat - The previous format.
    newFormat - The new format.
    Returns:
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.html b/docs/doc/reference/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.html index 2224ed4ea69..a5736a8fefa 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.html @@ -554,6 +554,8 @@

    canReuseDecoder

    Overrides:
    canReuseDecoder in class DecoderVideoRenderer
    +
    Parameters:
    +
    decoderName - The name of the decoder.
    oldFormat - The previous format.
    newFormat - The new format.
    Returns:
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/FlacFrameReader.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/FlacFrameReader.html index f26e6f978ca..89ad673ceef 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/FlacFrameReader.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/FlacFrameReader.html @@ -313,6 +313,7 @@

    getFirstSampleNumber

    Parameters:
    input - Input stream to get the sample number from (starting from the read position).
    +
    flacStreamMetadata - The FLAC metadata of the stream.
    Returns:
    The frame first sample number.
    Throws:
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.html b/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.html index ad373c0f868..22f4c7d5ef4 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.html @@ -763,6 +763,7 @@

    MediaCodecRenderer

    Parameters:
    trackType - The track type that the renderer handles.
    +
    codecAdapterFactory - A factory for MediaCodecAdapter instances.
    mediaCodecSelector - A decoder selector.
    enableDecoderFallback - Whether to enable fallback to lower-priority decoders if decoder initialization fails. This may result in using a decoder that is less efficient or slower diff --git a/docs/doc/reference/com/google/android/exoplayer2/offline/SegmentDownloader.html b/docs/doc/reference/com/google/android/exoplayer2/offline/SegmentDownloader.html index d3743056dcb..cc7efbb0b4e 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/offline/SegmentDownloader.html +++ b/docs/doc/reference/com/google/android/exoplayer2/offline/SegmentDownloader.html @@ -489,6 +489,7 @@

    getManifest

    Loads and parses a manifest.
    Parameters:
    +
    dataSource - The source to use when loading the manifest.
    dataSpec - The manifest DataSpec.
    removing - Whether the manifest is being loaded as part of the download being removed.
    Returns:
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashChunkSource.Factory.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashChunkSource.Factory.html index 80be9d85116..0494dbbbef3 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashChunkSource.Factory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashChunkSource.Factory.html @@ -221,6 +221,8 @@

    createDashChunkSource

    if unknown.
    enableEventMessageTrack - Whether to output an event message track.
    closedCaptionFormats - The Formats of closed caption tracks to be output.
    +
    playerEmsgHandler - The track output to write emsg messages to, or null if emsgs + shouldn't be written.
    transferListener - The transfer listener which should be informed of any data transfers. May be null if no listener is available.
    playerId - The PlayerId of the player using this chunk source.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashChunkSource.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashChunkSource.html index a9654c7aad1..ecc922664d2 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashChunkSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashChunkSource.html @@ -180,7 +180,7 @@

    Method Summary

    void updateManifest​(DashManifest newManifest, - int periodIndex) + int newPeriodIndex)
    Updates the manifest.
    @@ -223,11 +223,12 @@

    Method Detail

  • updateManifest

    void updateManifest​(DashManifest newManifest,
    -                    int periodIndex)
    + int newPeriodIndex)
    Updates the manifest.
    Parameters:
    newManifest - The new manifest.
    +
    newPeriodIndex - The index of the period covered by newManifest.
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.Factory.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.Factory.html index ea091376bbb..39c720b8e75 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.Factory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.Factory.html @@ -331,6 +331,8 @@

    createDashChunkSource

    if unknown.
    enableEventMessageTrack - Whether to output an event message track.
    closedCaptionFormats - The Formats of closed caption tracks to be output.
    +
    playerEmsgHandler - The track output to write emsg messages to, or null if emsgs + shouldn't be written.
    transferListener - The transfer listener which should be informed of any data transfers. May be null if no listener is available.
    playerId - The PlayerId of the player using this chunk source.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.html index 2c2e0700af2..e4976193496 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.html @@ -499,6 +499,7 @@

    updateManifest

    updateManifest in interface DashChunkSource
    Parameters:
    newManifest - The new manifest.
    +
    newPeriodIndex - The index of the period covered by newManifest.
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.html b/docs/doc/reference/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.html index 9f62b219889..6ec72c45f55 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.html @@ -393,12 +393,16 @@

    HlsMediaPeriod

    mediaTransferListener - The transfer listener to inform of any media data transfers. May be null if no listener is available.
    drmSessionManager - The DrmSessionManager to acquire DrmSessions with.
    +
    drmEventDispatcher - A DrmSessionEventListener.EventDispatcher used to distribute + DRM-related events.
    loadErrorHandlingPolicy - A LoadErrorHandlingPolicy.
    eventDispatcher - A dispatcher to notify of events.
    allocator - An Allocator from which to obtain media buffer allocations.
    compositeSequenceableLoaderFactory - A factory to create composite SequenceableLoaders for when this media source loads data from multiple streams.
    allowChunklessPreparation - Whether chunkless preparation is allowed.
    +
    metadataType - The type of metadata to extract from the period.
    useSessionKeys - Whether to use #EXT-X-SESSION-KEY tags.
    +
    playerId - The ID of the current player.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.html b/docs/doc/reference/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.html index 4ab12d88091..488f485b69a 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.html @@ -419,7 +419,9 @@

    Constructor Summary

    List<HlsMediaPlaylist.Part> trailingParts, HlsMediaPlaylist.ServerControl serverControl, Map<Uri,​HlsMediaPlaylist.RenditionReport> renditionReports) -  + +
    Constructs an instance.
    + @@ -776,18 +778,21 @@

    HlsMediaPlaylist

    List<HlsMediaPlaylist.Part> trailingParts, HlsMediaPlaylist.ServerControl serverControl, Map<Uri,​HlsMediaPlaylist.RenditionReport> renditionReports) +
    Constructs an instance.
    Parameters:
    playlistType - See playlistType.
    baseUri - See HlsPlaylist.baseUri.
    tags - See HlsPlaylist.tags.
    startOffsetUs - See startOffsetUs.
    +
    preciseStart - See preciseStart.
    startTimeUs - See startTimeUs.
    hasDiscontinuitySequence - See hasDiscontinuitySequence.
    discontinuitySequence - See discontinuitySequence.
    mediaSequence - See mediaSequence.
    version - See version.
    targetDurationUs - See targetDurationUs.
    +
    partTargetDurationUs - See partTargetDurationUs.
    hasIndependentSegments - See HlsPlaylist.hasIndependentSegments.
    hasEndTag - See hasEndTag.
    hasProgramDateTime - See hasProgramDateTime.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.ExecuteRunnable.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.ExecuteRunnable.html index f242a42b569..55e4ddb6f17 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.ExecuteRunnable.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.ExecuteRunnable.html @@ -180,7 +180,9 @@

    Constructor Summary

    ExecuteRunnable​(String tag, Runnable runnable) -  + +
    Constructs an instance.
    + @@ -243,9 +245,11 @@

    ExecuteRunnable

    public ExecuteRunnable​(@Size(max=23L)
                            String tag,
                            Runnable runnable)
    +
    Constructs an instance.
    Parameters:
    tag - A tag to use for logging.
    +
    runnable - The runnable to run.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/ActionSchedule.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/ActionSchedule.Builder.html index f77791b492b..a076a00474d 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/ActionSchedule.Builder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/ActionSchedule.Builder.html @@ -380,7 +380,7 @@

    Method Summary

    setMediaSources​(boolean resetPosition, MediaSource... sources) -
    Schedules a set media items action to be executed.
    +
    Schedules a set media sources action to be executed.
    @@ -389,7 +389,7 @@

    Method Summary

    long positionMs, MediaSource... sources) -
    Schedules a set media items action to be executed.
    +
    Schedules a set media source actions to be executed.
    @@ -908,7 +908,7 @@

    setMediaSources

    public ActionSchedule.Builder setMediaSources​(int mediaItemIndex, long positionMs, MediaSource... sources) -
    Schedules a set media items action to be executed.
    +
    Schedules a set media source actions to be executed.
    Parameters:
    mediaItemIndex - The media item index to start playback from or C.INDEX_UNSET if @@ -916,6 +916,7 @@

    setMediaSources

    positionMs - The position in milliseconds from where playback should start. If C.TIME_UNSET is passed the default position is used. In any case, if mediaItemIndex is set to C.INDEX_UNSET the position is not reset at all and this parameter is ignored.
    +
    sources - The media sources to be set on the player.
    Returns:
    The builder, for convenience.
    @@ -930,10 +931,11 @@

    setMediaSources

    @CanIgnoreReturnValue
     public ActionSchedule.Builder setMediaSources​(boolean resetPosition,
                                                   MediaSource... sources)
    -
    Schedules a set media items action to be executed.
    +
    Schedules a set media sources action to be executed.
    Parameters:
    resetPosition - Whether the playback position should be reset.
    +
    sources - The media sources to be set on the player.
    Returns:
    The builder, for convenience.
    @@ -1118,6 +1120,7 @@

    sendMessage

    Schedules sending a PlayerMessage.
    Parameters:
    +
    target - A message target.
    positionMs - The position in the current media item at which the message should be sent, in milliseconds.
    Returns:
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/ExtractorAsserts.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/ExtractorAsserts.html index cd01c3904a9..8f0e13d7ddf 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/ExtractorAsserts.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/ExtractorAsserts.html @@ -432,6 +432,9 @@

    assertBehavior

    The output of the extractor is compared against prerecorded dump files.

    Parameters:
    +
    factory - An ExtractorAsserts.ExtractorFactory which creates instances of the Extractor + class which is to be tested.
    +
    file - The input file to pass to the extractor.
    assertionConfig - Details of how to read and process the source and dump files.
    simulationConfig - Details on the environment to simulate and behaviours to assert.
    Throws:
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeAdaptiveMediaSource.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeAdaptiveMediaSource.html index 5830c66b91d..936f0dfd091 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeAdaptiveMediaSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeAdaptiveMediaSource.html @@ -336,6 +336,7 @@

    createMediaPeriod

    allocator - An Allocator from which to obtain media buffer allocations.
    mediaSourceEventDispatcher - An MediaSourceEventListener.EventDispatcher to dispatch media source events.
    +
    drmSessionManager - A DrmSessionManager to allow DRM interactions.
    drmEventDispatcher - An MediaSourceEventListener.EventDispatcher to dispatch DRM events.
    transferListener - The transfer listener which should be informed of any data transfers. diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaPeriod.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaPeriod.html index 2babb41f744..c36805f7a9a 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaPeriod.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaPeriod.html @@ -885,6 +885,7 @@

    createSampleStream

    Creates a new FakeSampleStream.
    Parameters:
    +
    allocator - An Allocator from which to obtain media buffer allocations.
    mediaSourceEventDispatcher - A MediaSourceEventListener.EventDispatcher to notify of media events.
    drmSessionManager - A DrmSessionManager for DRM interactions.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaSource.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaSource.html index 013fca63cde..bcaeea8a582 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaSource.html @@ -845,6 +845,7 @@

    createMediaPeriod

    allocator - An Allocator from which to obtain media buffer allocations.
    mediaSourceEventDispatcher - An MediaSourceEventListener.EventDispatcher to dispatch media source events.
    +
    drmSessionManager - A DrmSessionManager to allow DRM interactions.
    drmEventDispatcher - An MediaSourceEventListener.EventDispatcher to dispatch DRM events.
    transferListener - The transfer listener which should be informed of any data transfers. diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeTimeline.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeTimeline.html index d1cbfa2ad4d..8e09f5617a4 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeTimeline.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeTimeline.html @@ -497,6 +497,7 @@

    FakeTimeline

    Creates a fake timeline with the given window definitions.
    Parameters:
    +
    manifests - The manifests of the windows.
    windowDefinitions - A list of FakeTimeline.TimelineWindowDefinitions.
    @@ -513,6 +514,8 @@

    FakeTimeline

    Creates a fake timeline with the given window definitions and ShuffleOrder.
    Parameters:
    +
    manifests - The manifests of the windows.
    +
    shuffleOrder - A shuffle ordering for the windows.
    windowDefinitions - A list of FakeTimeline.TimelineWindowDefinitions.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeTrackSelector.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeTrackSelector.html index b398b1e97de..25a5f613ecc 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeTrackSelector.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeTrackSelector.html @@ -363,6 +363,7 @@

    selectAllTracks

    renderer, track group and track (in that order).
    rendererMixedMimeTypeAdaptationSupports - The RendererCapabilities.AdaptiveSupport for mixed MIME type adaptation for the renderer.
    +
    params - The parameters to use for the track selection.
    Returns:
    The ExoTrackSelection.Definitions for the renderers. A null entry indicates no selection was made.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/MediaSourceTestRunner.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/MediaSourceTestRunner.html index 6ebc37973e1..ce4015e8e96 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/MediaSourceTestRunner.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/MediaSourceTestRunner.html @@ -442,6 +442,7 @@

    createPeriod

    Parameters:
    periodId - The id of the period to create.
    +
    startPositionUs - The expected start position, in microseconds.
    Returns:
    The created MediaPeriod.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/TimelineAsserts.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/TimelineAsserts.html index 58767ef7756..69e05581104 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/TimelineAsserts.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/TimelineAsserts.html @@ -313,6 +313,7 @@

    assertWindowTags

    Asserts that window tags are set correctly.
    Parameters:
    +
    timeline - The timeline to read actual window tags from.
    expectedWindowTags - A list of expected window tags. If a tag is unknown or not important null can be passed to skip this window.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.html b/docs/doc/reference/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.html index a50ee86742b..263bff5b651 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.html @@ -628,7 +628,9 @@

    getSpecificityScore

  • Each class and voice match adds 4 to the score.
  • Tag matching adds 2 to the score.
  • Universal selector matching scores 1. - + + +

    See also CSS Cascading.

    Parameters:
    id - The id of the cue if present, null otherwise.
    @@ -637,8 +639,6 @@

    getSpecificityScore

    voice - Annotated voice if present, null otherwise.
    Returns:
    The score of the match, zero if there is no match.
    -
    See Also:
    -
    CSS Cascading
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.html index 356496649b6..a91e29100d7 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.html @@ -879,6 +879,7 @@

    selectAllTracks

    renderer, track group and track (in that order).
    rendererMixedMimeTypeAdaptationSupports - The RendererCapabilities.AdaptiveSupport for mixed MIME type adaptation for the renderer.
    +
    params - The parameters to use for the track selection.
    Returns:
    The ExoTrackSelection.Definitions for the renderers. A null entry indicates no selection was made.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/MappingTrackSelector.MappedTrackInfo.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/MappingTrackSelector.MappedTrackInfo.html index e5c11b36105..69e3355c301 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/MappingTrackSelector.MappedTrackInfo.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/MappingTrackSelector.MappedTrackInfo.html @@ -593,6 +593,7 @@

    getAdaptiveSupport

    Parameters:
    rendererIndex - The renderer index.
    groupIndex - The index of the track group.
    +
    trackIndices - The indices of the tracks in the track group for which to query support.
    Returns:
    The RendererCapabilities.AdaptiveSupport.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/RandomTrackSelection.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/RandomTrackSelection.html index 7ab48fe986e..40cb8da07e7 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/RandomTrackSelection.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/RandomTrackSelection.html @@ -224,11 +224,13 @@

    Constructor Summary

    Description -RandomTrackSelection​(TrackGroup group, +RandomTrackSelection​(TrackGroup group, int[] tracks, - int type, + @com.google.android.exoplayer2.trackselection.TrackSelection.Type int type, Random random) -  + +
    Creates a new instance.
    + @@ -318,7 +320,7 @@

    Methods inherited from interface com.google.android.exoplayer2.tracksel

    Constructor Detail

    - +
      @@ -326,13 +328,15 @@

      Constructor Detail

      RandomTrackSelection

      public RandomTrackSelection​(TrackGroup group,
                                   int[] tracks,
      -                            int type,
      +                            @com.google.android.exoplayer2.trackselection.TrackSelection.Type int type,
                                   Random random)
      +
      Creates a new instance.
      Parameters:
      group - The TrackGroup. Must not be null.
      tracks - The indices of the selected tracks within the TrackGroup. Must not be null or empty. May be in any order.
      +
      type - The TrackSelection.Type of this track selection.
      random - A source of random numbers.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/DataSourceUtil.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/DataSourceUtil.html index bddbd3d9796..4e5c16b63af 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/DataSourceUtil.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/DataSourceUtil.html @@ -234,6 +234,7 @@

      readExactly

      Parameters:
      dataSource - The source from which to read.
      +
      length - The number of bytes to read.
      Returns:
      The read data.
      Throws:
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultDataSource.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultDataSource.html index bc4f0bb6a17..b5d232c50f4 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultDataSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultDataSource.html @@ -336,6 +336,7 @@

      DefaultDataSource

      Parameters:
      context - A context.
      +
      allowCrossProtocolRedirects - Whether to allow cross-protocol redirects.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/Util.html b/docs/doc/reference/com/google/android/exoplayer2/util/Util.html index 9d9a658c669..9b21be443f3 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/Util.html +++ b/docs/doc/reference/com/google/android/exoplayer2/util/Util.html @@ -2695,6 +2695,7 @@

    getPlayoutDurationForMediaDuration

    Parameters:
    mediaDuration - The duration to scale.
    +
    speed - The factor by which playback is sped up.
    Returns:
    The scaled duration, in the same units as mediaDuration.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/video/DecoderVideoRenderer.html b/docs/doc/reference/com/google/android/exoplayer2/video/DecoderVideoRenderer.html index 0d98bae9939..1c5c7bffd2b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/video/DecoderVideoRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/video/DecoderVideoRenderer.html @@ -1123,6 +1123,7 @@

    canReuseDecoder

    The default implementation does not allow decoder reuse.

    Parameters:
    +
    decoderName - The name of the decoder.
    oldFormat - The previous format.
    newFormat - The new format.
    Returns:
    diff --git a/docs/doc/reference/constant-values.html b/docs/doc/reference/constant-values.html index ba13db6f7d6..37a24ce191e 100644 --- a/docs/doc/reference/constant-values.html +++ b/docs/doc/reference/constant-values.html @@ -1946,21 +1946,21 @@

    com.google.*

    public static final String VERSION -"2.18.4" +"2.18.5" public static final int VERSION_INT -2018004 +2018005 public static final String VERSION_SLASHY -"ExoPlayerLib/2.18.4" +"ExoPlayerLib/2.18.5" diff --git a/docs/doc/reference/index-all.html b/docs/doc/reference/index-all.html index 68e463a3748..77eb53cdda8 100644 --- a/docs/doc/reference/index-all.html +++ b/docs/doc/reference/index-all.html @@ -12169,7 +12169,9 @@

    E

    Schedules a Runnable.
    ExecuteRunnable(String, Runnable) - Constructor for class com.google.android.exoplayer2.testutil.Action.ExecuteRunnable
    -
     
    +
    +
    Constructs an instance.
    +
    exists() - Method in class com.google.android.exoplayer2.util.AtomicFile
    Returns whether the file or its backup exists.
    @@ -20982,7 +20984,9 @@

    H

    Represents an HLS media playlist.
    HlsMediaPlaylist(@com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.PlaylistType int, String, List<String>, long, boolean, long, boolean, int, long, int, long, long, boolean, boolean, boolean, DrmInitData, List<HlsMediaPlaylist.Segment>, List<HlsMediaPlaylist.Part>, HlsMediaPlaylist.ServerControl, Map<Uri, HlsMediaPlaylist.RenditionReport>) - Constructor for class com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist
    -
     
    +
    +
    Constructs an instance.
    +
    HlsMediaPlaylist.Part - Class in com.google.android.exoplayer2.source.hls.playlist
    A media part.
    @@ -31046,8 +31050,10 @@

    R

    An ExoTrackSelection whose selected track is updated randomly.
    -
    RandomTrackSelection(TrackGroup, int[], int, Random) - Constructor for class com.google.android.exoplayer2.trackselection.RandomTrackSelection
    -
     
    +
    RandomTrackSelection(TrackGroup, int[], @com.google.android.exoplayer2.trackselection.TrackSelection.Type int, Random) - Constructor for class com.google.android.exoplayer2.trackselection.RandomTrackSelection
    +
    +
    Creates a new instance.
    +
    RandomTrackSelection.Factory - Class in com.google.android.exoplayer2.trackselection
    Factory for RandomTrackSelection instances.
    @@ -37448,11 +37454,11 @@

    S

    setMediaSources(boolean, MediaSource...) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
    -
    Schedules a set media items action to be executed.
    +
    Schedules a set media sources action to be executed.
    setMediaSources(int, long, MediaSource...) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
    -
    Schedules a set media items action to be executed.
    +
    Schedules a set media source actions to be executed.
    setMediaSources(MediaSource...) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
    diff --git a/docs/doc/reference/member-search-index.js b/docs/doc/reference/member-search-index.js index ca3effc492e..4351561937c 100644 --- a/docs/doc/reference/member-search-index.js +++ b/docs/doc/reference/member-search-index.js @@ -44267,9 +44267,10 @@ memberSearchIndex = { 'p': 'com.google.android.exoplayer2.trackselection', 'c': 'RandomTrackSelection', - 'l': 'RandomTrackSelection(TrackGroup, int[], int, Random)', + 'l': + 'RandomTrackSelection(TrackGroup, int[], @com.google.android.exoplayer2.trackselection.TrackSelection.Type int, Random)', 'url': - '%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int,java.util.Random)' + '%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],@com.google.android.exoplayer2.trackselection.TrackSelection.Typeint,java.util.Random)' }, { 'p': 'com.google.android.exoplayer2.source.dash.manifest', diff --git a/docs/doc/reference/member-search-index.zip b/docs/doc/reference/member-search-index.zip index 326387919bffaae0d5f1c1d6b099ecd4c5f54191..a2ca3c669ad2dc11863b5b14c7cfa5ec498b3767 100644 GIT binary patch delta 49635 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 A;{X5v delta 49620 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 jj7%a7A`BcH91J4)NntQKrh^*OpQJO{u